关于Laravel Route重定向的一个注意点

5年以前  |  阅读数:1023 次  |  编程语言:PHP 

发现问题

最近在做项目发现一个奇怪的现象,我的路由配置里有如下配置:


    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分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例