关于Laravel Route重定向的一个注意点


Posted in PHP onJanuary 16, 2017

发现问题

最近在做项目发现一个奇怪的现象,我的路由配置里有如下配置:

Route::group(array('prefix'=>'admin','before'=>'adminauth'),function(){
 // 管理员登录
 Route::get('/',function(){
 return Redirect::to('admin/login');
 });
 Route::get('login','UserController@adminLogin');
}

目的是无论用户输入”admin”,还是”admin/login”都能跳转到登录界面。然而现实情况是输入”admin”之后,浏览器会无限重定向,firebug记录如下:

GET /public/admin/ 301 Moved Permanently 
GET admin  301 Moved Permanently
GET admin  301 Moved Permanently
GET /public/admin/ 301 Moved Permanently
GET admin  301 Moved Permanently
GET /public/admin/ 301 Moved Permanently
GET admin  301 Moved Permanently
....

经过一番搜索后试验,终于得出结论,问题有两点:

      1.public目录下正好有个admin目录,存放后台相关js和css

      2.laravel自带的.htaccess的这样一条规则:

RewriteEngine On
# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /public/$1 [L,R=301] #注意这条
 
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

解释一下原理:

访问public/admin目录时,apache会自动转成”public/admin/”的形式,而这种形式正好符合重写的规则,又被重写回”public/admin”的形式。因为public/admin目录确实存在,所以请求根本不会到达index.php。

所以故事就是这样,因为301那条规则的存在,无限重定向产生了。

解决方案:

      1.不要把public目录下已有的目录名做为路由地址

      2.301规则前加一条”RewriteCond %{REQUEST_FILENAME} !-d”,但是这样会使该目录被直接访问。建议生产环境中关掉apache的autoindex模块(呃,我发现我用的wamp关掉这个模块apache就启动不了了- -!)。

补充:

经过一些实验,建议将.htaccess文件改成如下:

RewriteEngine On
# Redirect Trailing Slashes...
RewriteCond %{REQUEST_FILENAME} !-d  #防止真实目录导致循环重定向
RewriteRule ^(.*)/$ /public/$1 [L,R=301]
 
# Handle Front Controller...
#RewriteCond %{REQUEST_FILENAME} !-d  #防止用户直接打开真实目录
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

总结

以上就是关于Laravel Route重定向的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

PHP 相关文章推荐
建立文件交换功能的脚本(一)
Oct 09 PHP
php FPDF类库应用实现代码
Mar 20 PHP
mac下使用brew配置环境的步骤分享
May 23 PHP
PHP版国家代码、缩写查询函数代码
Aug 14 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
Nov 02 PHP
如何使用php绘制在图片上的正余弦曲线
Jun 08 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
PHP实现页面静态化的超简单方法
Sep 06 PHP
PHP反射API示例分享
Oct 08 PHP
[原创]PHP实现SQL语句格式化功能的方法
Jul 28 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
PHP strripos函数用法总结
Feb 11 PHP
php文件管理基本功能简单操作
Jan 16 #PHP
Python中使用django form表单验证的方法
Jan 16 #PHP
phpinfo()中Loaded Configuration File(none)的解决方法
Jan 16 #PHP
php实现文件上传及头像预览功能
Jan 15 #PHP
给大家分享几个常用的PHP函数
Jan 15 #PHP
详解Yii实现分页的两种方法
Jan 14 #PHP
PHP微信分享开发详解
Jan 14 #PHP
You might like
调频问题解答
2021/03/01 无线电
《PHP编程最快明白》第七讲:php图片验证码与缩略图
2010/11/01 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
php简单实现数组分页的方法
2016/04/30 PHP
GreyBox技术总结(转)
2010/11/23 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
jQuery取消特定的click事件
2016/02/29 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
vue双向绑定的简单实现
2016/12/22 Javascript
Vue如何引入远程JS文件
2017/04/20 Javascript
JavaScript中Dom操作实例详解
2019/07/08 Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
2021/02/25 Vue.js
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
使用requests库制作Python爬虫
2018/03/25 Python
Python使用matplotlib绘制随机漫步图
2018/08/27 Python
如何更改 pandas dataframe 中两列的位置
2019/12/27 Python
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
《猴子种果树》教学反思
2014/04/26 职场文书
竞争上岗演讲稿范文
2014/05/12 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
改进工作作风心得体会
2016/01/23 职场文书