关于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 相关文章推荐
Dedecms V3.1 生成HTML速度的优化办法
Mar 18 PHP
PHP实现MVC开发得最简单的方法――模型
Apr 10 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
本地计算机无法启动Apache故障处理
Aug 08 PHP
PHP多线程之内部多线程实例分析
Mar 09 PHP
php curl请求信息和返回信息设置代码实例
Apr 27 PHP
php类的扩展和继承用法实例
Jun 20 PHP
PHP7.0版本备注
Jul 23 PHP
php简单实现多语言切换的方法
May 09 PHP
PHP页面输出时js设置input框的选中值
Sep 30 PHP
微信公众平台开发(五) 天气预报功能开发
Dec 03 PHP
PHP http请求超时问题解决方案
Nov 13 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学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
了解jQuery技巧来提高你的代码(个人觉得那个jquery的手册很不错)
2012/02/10 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
JS实现页面打印功能
2017/03/16 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
JavaScript"模拟事件"的注意要点详解
2019/02/13 Javascript
微信小程序时间戳转日期的详解
2019/04/30 Javascript
layui 富文本赋值,取值,取纯文本值的实例
2019/09/18 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
JavaScript代码实现简单计算器
2020/12/27 Javascript
构建Python包的五个简单准则简介
2015/06/15 Python
在Python中marshal对象序列化的相关知识
2015/07/01 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
django允许外部访问的实例讲解
2018/05/14 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
python如何保证输入键入数字的方法
2019/08/23 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
苹果Mac升级:MacSales.com
2017/11/20 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
什么是makefile? 如何编写makefile?
2012/08/08 面试题
化工专业应届生求职信
2013/11/08 职场文书
个人四风对照检查材料
2014/09/26 职场文书
2014年教务处工作总结
2014/12/03 职场文书
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle