关于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初学者头疼问题总结
Jul 08 PHP
PHP实现多进程并行操作的详解(可做守护进程)
Jun 18 PHP
php+xml结合Ajax实现点赞功能完整实例
Jan 30 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
May 13 PHP
PHP结合Jquery和ajax实现瀑布流特效
Jan 07 PHP
PHP最常用的正则表达式
Feb 13 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
Jun 02 PHP
php基于数组函数实现关联表的编辑操作示例
Jul 04 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
PHP中遍历数组的三种常用方法实例分析
Jun 24 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
Mar 16 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读取数据库信息的几种方法
2008/05/24 PHP
php cookie 登录验证示例代码
2009/03/16 PHP
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
react-native ListView下拉刷新上拉加载实现代码
2017/08/03 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
Django内容增加富文本功能的实例
2017/10/17 Python
python编程线性回归代码示例
2017/12/07 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
对python函数签名的方法详解
2019/01/22 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
2020/02/07 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
什么是接口(Interface)?
2013/02/01 面试题
北京银河万佳Java面试题
2012/03/21 面试题
幼儿园植树节活动总结
2014/07/04 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
六年级语文教学反思
2016/03/03 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
使用Pytorch训练two-head网络的操作
2021/05/28 Python
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫