避免使用301重定向进行无限循环

时间:2015-03-20 09:06:53

标签: .htaccess redirect http-status-code-301

我正在使用.htaccess重定向

http://www.example.com/foo/

http://www.example.com/foo/bar

这是我的代码:

redirect 301 /foo/ http://www.example.com/foo/bar

然而,这会产生反馈回路,例如

http://www.example.com/foo/barbarbarbarbarbar等。

我试过在它周围放置分隔符:

redirect 301 ^/foo/$ http://www.example.com/foo/bar

但是重定向根本就没有发生。我可能错过了一些非常简单的语法点。有任何想法吗?感谢。

修改

这是我的(差不多)完整的.htaccess文件:

RewriteEngine On
RewriteBase /

# Canonical is www version
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

#redirect => http unless special page
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/(javascripts|images|library|stylesheets)
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

#redirect => https for special pages
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# send to router
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

4 个答案:

答案 0 :(得分:1)

这取决于您希望使用重定向公开的资源是什么。 它是文件还是目录。

如果你要在bar下公开一个目录,你应该尝试:

RedirectMatch 301 ^/foo/ http://www.example.com/foo/bar/

如果要重定向到文件,则应使用以下语法:

redirect 301 /foo http://www.example.com/foo/bar

您可以看到此post了解更多信息

答案 1 :(得分:1)

你的规则如下:

RewriteEngine On
RewriteBase /

# Canonical is www version
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule ^ http://www.example.com%{REQUEST_URI} [L,R=301]

#redirect => http unless special page
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTPS} on
RewriteCond %{THE_REQUEST} !/(javascripts|images|library|stylesheets)
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

#redirect => https for special pages
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTPS} off
RewriteRule !^index\.php$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteRule ^foo/?$ /foo/bar [L,NC,R=301]

# send to router
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

请确保在新浏览器中测试此内容或在测试前清除浏览器缓存。

答案 2 :(得分:0)

您可以使用passthrough而不是使用重定向。

RewriteRule ^/foo$ /foo/bar [PT]

答案 3 :(得分:0)

有关您的信息,这实际上取决于您的托管服务提供商。它可能位于Load Balancer后面,并且您没有正确的env var集(如HTTPS和其他...)。

在我的情况下(Infomaniak),没有任何实际工作,我得到了无限的重定向循环。

为Infomaniak执行此操作的正确方法是actually explained in their support site

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://your-domain.com/$1 [R=301,L]

因此,请务必咨询您的托管服务提供商。希望他们有一篇文章解释如何做到这一点。否则,只需询问支持。