关于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 相关文章推荐
ajax缓存问题解决途径
Dec 06 PHP
php中的时间显示
Jan 18 PHP
一个PHP分页类的代码
May 18 PHP
微信营销平台系统?刮刮乐的开发
Jun 10 PHP
php+xml编程之xpath的应用实例
Jan 24 PHP
Symfony实现行为和模板中取得request参数的方法
Mar 17 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
Aug 17 PHP
利用PHP实现开心消消乐的算法示例
Oct 12 PHP
php设计模式之职责链模式定义与用法经典示例
Sep 19 PHP
TP5框架请求响应参数实例分析
Oct 17 PHP
laravel 错误处理,接口错误返回json代码
Oct 25 PHP
PHP实用小技巧之调用录像的方法
Dec 05 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
SONY ICF-SW55的电路分析
2021/03/02 无线电
php把数组值转换成键的方法
2015/07/13 PHP
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
Zend Framework教程之视图组件Zend_View用法详解
2016/03/05 PHP
JavaScript入门教程(1) 什么是JS
2009/01/31 Javascript
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
js几秒以后倒计时跳转示例
2013/12/26 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
vue实现组件之间传值功能示例
2018/07/13 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
小程序最新获取用户昵称和头像的方法总结
2019/09/23 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
2021/01/03 Vue.js
python超简单解决约瑟夫环问题
2015/05/12 Python
Python numpy 常用函数总结
2017/12/07 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
安装python及pycharm的教程图解
2019/10/10 Python
Python的几种主动结束程序方式
2019/11/22 Python
Django基于客户端下载文件实现方法
2020/04/21 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
酒店实习个人鉴定
2013/12/07 职场文书
生产总经理岗位职责
2013/12/19 职场文书
母亲节感恩活动记录
2014/03/16 职场文书
民事辩护词范文
2015/05/21 职场文书
python实现的web监控系统
2021/04/27 Python
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers