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

Avoid infinite loop with 301 redirects

我正在使用 .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/ [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]

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

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

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

如果您要重定向到一个文件,您应该使用以下语法:

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

你可以看到这个post了解更多信息

你的规则是这样的:

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]

确保在新的浏览器中进行测试或在测试前清除浏览器缓存。

您可以使用直通,而不是使用重定向。

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

供您参考,这实际上取决于您的托管服务提供商。它可能位于负载均衡器之后,并且您没有设置正确的环境变量(如 HTTPS 和其他...)。

在我的例子中 (Infomaniak),没有任何实际效果,我得到了无限重定向循环。

Infomaniak 的正确方法是 actually explained in their support site:

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

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