关于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 相关文章推荐
php.ini中文版
Oct 09 PHP
使用NetBeans + Xdebug调试PHP程序的方法
Apr 12 PHP
php中删除字符串中最先出现某个字符的实现代码
Feb 03 PHP
php堆排序(heapsort)练习
Nov 13 PHP
php更新修改excel中的内容实例代码
Feb 26 PHP
PHP实现设计模式中的抽象工厂模式详解
Oct 11 PHP
php文件上传简单实现方法
Jan 24 PHP
php检查页面是否被百度收录
Oct 28 PHP
Zend Framework路由器用法实例详解
Dec 11 PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
Mar 28 PHP
php微信公众号开发之音乐信息
Oct 20 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
PHP大批量数据操作时临时调整内存与执行时间的方法
2011/04/20 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
php解决约瑟夫环示例
2014/04/09 PHP
php自定义时间转换函数示例
2016/12/07 PHP
用js实现计算加载页面所用的时间
2010/04/02 Javascript
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
JavaScript中的单引号和双引号报错的解决方法
2014/09/01 Javascript
JavaScript实现图片DIV竖向滑动的方法
2015/04/25 Javascript
浅谈NodeJS中require路径问题
2015/05/07 NodeJs
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
在JSP中如何实现MD5加密的方法
2016/11/02 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
Vue页面跳转动画效果的实现方法
2018/09/23 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
python抓取豆瓣图片并自动保存示例学习
2014/01/10 Python
Python中操作MySQL入门实例
2015/02/08 Python
Python中 Lambda表达式全面解析
2016/11/28 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
Python识别验证码的实现示例
2020/09/30 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
医学专业毕业生推荐信
2013/11/14 职场文书
毕业生的自我评价
2013/12/30 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
校园广播站开场白
2015/06/01 职场文书
保留意见审计报告
2015/06/05 职场文书
800字作文之大雪
2019/12/04 职场文书
Java实现给Word文件添加文字水印
2022/02/15 Java/Android