关于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 相关文章推荐
Uchome1.2 1.5 代码学习 common.php
Apr 24 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
Mar 09 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
Jul 17 PHP
关于Sphinx创建全文检索的索引介绍
Jun 25 PHP
PHP代码优化的53个细节
Mar 03 PHP
php实现读取超大文件的方法
Jul 28 PHP
基于PHP的简单采集数据入库程序【续篇】
Jul 30 PHP
php检查日期函数checkdate用法实例
Mar 19 PHP
php简单图像创建入门实例
Jun 10 PHP
PHP并发查询MySQL的实例代码
Aug 09 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
什么是PHP7中的孤儿进程与僵尸进程
Apr 14 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脚本的10个技巧(1)
2006/10/09 PHP
ThinkPHP添加更新标签的方法
2014/12/05 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
Javascript 面向对象之重载
2010/05/04 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
js动态加载以及确定加载完成的代码
2011/07/31 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
使用js 设置url参数
2013/07/08 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
node通过npm写一个cli命令行工具
2017/10/12 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
JavaScript this绑定过程深入详解
2018/12/07 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
Javascript call及apply应用场景及实例
2020/08/26 Javascript
python正则表达式的使用
2017/06/12 Python
Python中str.join()简单用法示例
2018/03/20 Python
python实现定时发送qq消息
2019/01/18 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
Python实现画图软件功能方法详解
2020/07/28 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
公务员学习中国梦心得体会
2016/01/05 职场文书
反邪教学习心得体会
2016/01/15 职场文书
小学美术教学反思
2016/02/17 职场文书