关于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 pack与unpack 摸板字符字符含义
Oct 29 PHP
PHP获取表单textarea数据中的换行问题
Sep 10 PHP
PHP中替换换行符的几种方法小结
Oct 15 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
Apr 23 PHP
smarty获得当前url的方法分享
Feb 14 PHP
ThinkPHP中RBAC类的四种用法分析
Nov 24 PHP
浅谈ThinkPHP的URL重写
Nov 25 PHP
php模拟post提交数据的方法
Feb 12 PHP
win7系统配置php+Apache+mysql环境的方法
Aug 21 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
php和asp语法上的区别总结
May 12 PHP
Thinkphp5.0框架视图view的循环标签用法示例
Oct 12 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 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
php从给定url获取文件扩展名的方法
2015/03/14 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
javascript 面向对象思想 附源码
2009/07/07 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
关于vue-router路径计算问题
2017/05/10 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
[59:00]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第一场 3月7日
2021/03/11 DOTA
python简单的函数定义和用法实例
2015/05/07 Python
python 的列表遍历删除实现代码
2020/04/12 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
2019/03/01 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
草莓网化妆品日本站:Strawberrynet日本
2017/10/20 全球购物
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
《小小雨点》教学反思
2014/02/18 职场文书
幼儿教师培训感言
2014/03/08 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
追悼会家属答谢词
2015/09/29 职场文书
浅谈Redis位图(Bitmap)及Redis二进制中的问题
2021/07/15 Redis
CSS 鼠标点击拖拽效果的实现代码
2022/12/24 HTML / CSS