发现问题
最近在做项目发现一个奇怪的现象,我的路由配置里有如下配置:
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重定向的一个注意点。
相关文章:
laravel框架里, {{url}}和{{asset}}有什么不同?
laravel中命名路由的使用
探究laravel使用env函数读取环境变量为null的问题
