关于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 相关文章推荐
第十二节--类的自动加载
Nov 16 PHP
PHP 读取和修改大文件的某行内容的代码
Oct 30 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
php处理斐波那契数列非递归方法
Feb 04 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
Jun 20 PHP
深入Nginx + PHP 缓存详解
Jul 11 PHP
php使用google地图应用实例
Dec 31 PHP
php中将一个对象保存到Session中的方法
Mar 13 PHP
php实现编辑和保存文件的方法
Jul 20 PHP
PHP调用Mailgun发送邮件的方法
May 04 PHP
Laravel学习教程之View模块详解
Sep 18 PHP
laravel 实现用户登录注销并限制功能
Oct 24 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
学习PHP的数组总结【经验】
2016/05/05 PHP
php实现微信模板消息推送
2018/03/30 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
Javascript中自动切换焦点实现代码
2012/12/15 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
2014/03/21 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
Javascript基础教程之数据类型 (字符串 String)
2015/01/18 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
vue.js实现只能输入数字的输入框
2019/10/19 Javascript
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
2017/09/26 Python
python实现二叉树的遍历
2017/12/11 Python
python中单下划线_的常见用法总结
2018/07/10 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
python实现计算器简易版
2020/12/17 Python
介绍一下linux的文件系统
2012/03/20 面试题
行政办公员自我评价分享
2013/12/14 职场文书
大学生职业生涯规划范文
2014/01/22 职场文书
促销活动计划书
2014/05/02 职场文书
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
师德先进个人事迹材料
2014/12/19 职场文书
小学见习报告
2015/06/23 职场文书
详解GaussDB for MySQL性能优化
2021/05/18 MySQL
css常用字体属性与背景属性介绍
2022/02/28 HTML / CSS
Python中的 Set 与 dict
2022/03/13 Python