Laravel 4 htaccess重定向循环


Laravel 4 htaccess redirect loop

我有Laravel 4应用程序和一些子文件夹应用程序。Laravel 4应用程序在根文件夹中,有一个.htaccess文件,其中包含以下内容:

Options -MultiViews
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www'.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

现在,如果我转到www.mysite.com/subfolder-app,我会得到重定向循环错误。服务器上的任何子文件夹都会出现此错误

您应该能够简单地更改RewriteRule以包含子文件夹:

Options -MultiViews
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www'.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /subfolder-app/index.php [L]

但是,请注意,这不会随着您的环境而"致命"地改变。如果您的localhost在webroot而不是子文件夹中使用Laravel运行,那么对htaccess文件进行此更改可能会使其在localhost-dev环境中不再工作。

一个解决方案是不使用.htaccess文件,而是在域的虚拟主机配置文件中包含重写规则。这样做的能力将取决于你的主机。

该解决方案还具有从我们的应用程序代码库中删除服务器配置(而不是应用程序配置)的好处

编辑

这是OP使用的最终分辨率,因为它并不完全是我建议的:

Options -MultiViews 
RewriteEngine On 
# Rewrite to "www" version
RewriteCond %{HTTP_HOST} !^www'. 
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] 
# Add -d check to ensure only rewrite if url 
# is not an existing directory
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^ index.php [L]

所以我遇到了类似的问题,在我的公共laravel项目文件中有子文件夹。当我向xyz.com/sub-directory发出请求时,它会创建一个重定向循环。我解决这个问题的方法是在后面的斜杠之前添加以下内容:

RewriteRule ^sub-directory/([a-zA-Z0-9-_]*/)*?$ / [L,R=301]
# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /$1 [L,R=301]

laravel-github页面中提到的解决方案之一是删除尾部斜杠,但这会将您的子目录暴露给默认的apache目录查看器,您可能真的不希望这样。这个方法对我很有效,因为它递归地将重定向规则添加到子目录和其中任何目录的基本路径中(只要它们是由字母数字、-或_符号定义的)。