关于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+MySQL5.0中文乱码解决方法
Nov 20 PHP
初级的用php写的采集程序
Mar 16 PHP
PHP获取网卡地址的代码
Apr 09 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
Jun 17 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
Sep 07 PHP
ThinkPHP3.1查询语言详解
Jun 19 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
Jun 21 PHP
Laravel 5框架学习之用户认证
Apr 09 PHP
Thinkphp3.2.3分页使用实例解析
Jul 28 PHP
Yii2实现上下联动下拉框功能的方法
Aug 10 PHP
php利用嵌套数组拼接与解析json的方法
Feb 07 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 25 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(7) php 字符串相关应用
2010/03/05 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
用javascript实现计算两个日期的间隔天数
2007/08/14 Javascript
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
JavaScript中this的四个绑定规则总结
2016/09/26 Javascript
jQuery继承extend用法详解
2016/10/10 Javascript
vue双向绑定的简单实现
2016/12/22 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
python3使用tkinter实现ui界面简单实例
2014/01/10 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
Python实现购物车购物小程序
2018/04/18 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
解决python -m pip install --upgrade pip 升级不成功问题
2020/03/05 Python
python用什么编辑器进行项目开发
2020/06/17 Python
python中常见错误及解决方法
2020/06/21 Python
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
使用AJAX和Django获取数据的方法实例
2020/10/25 Python
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
投诉书格式范本
2015/07/02 职场文书
学校运动会通讯稿
2015/07/18 职场文书
班级班风口号大全
2015/12/25 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书
Python基础之变量的相关知识总结
2021/06/23 Python