关于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 相关文章推荐
NO3第三帝国留言簿制作过程
Oct 09 PHP
php 代码优化的42条建议 推荐
Sep 25 PHP
php 缩略图实现函数代码
Jun 23 PHP
php ZipArchive压缩函数详解实例
Nov 06 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
Aug 05 PHP
php数组添加元素方法小结
Dec 20 PHP
PHP+shell实现多线程的方法
Jul 01 PHP
thinkPHP模板中函数的使用方法示例
Nov 30 PHP
php常用字符函数实例小结
Dec 29 PHP
php7安装mongoDB扩展的方法分析
Aug 02 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
PHP实现浏览器格式化显示XML的方法示例
Jan 22 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中include与require使用方法区别详解
2013/10/19 PHP
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
php文件上传 你真的掌握了吗
2016/11/28 PHP
YII框架批量插入数据的方法
2017/03/18 PHP
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
jquery获取radio值实例
2014/10/16 Javascript
jquery解决客户端跨域访问问题
2015/01/06 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
2015/06/09 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
详解JavaScript的变量和数据类型
2015/11/27 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
Express结合Webpack的全栈自动刷新
2019/05/23 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
python进阶教程之异常处理
2014/08/30 Python
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
详解C++编程中一元运算符的重载
2016/01/19 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
2018/01/29 Python
python程序控制NAO机器人行走
2019/04/29 Python
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
.NET remoting的两种通道是什么
2016/05/31 面试题
编程用JAVA解析XML的方式
2013/07/07 面试题
会展中心部门工作职责
2013/11/27 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
导游词之清晏园
2019/11/22 职场文书
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
2021/05/05 Golang
详解JavaScript中Arguments对象用途
2021/08/30 Javascript