mod_rewrite 删除尾部斜杠导致循环

mod_rewrite 删除尾部斜杠导致循环

我有一个网站使用 mod_rewrite 来制作漂亮的 URL...我到处都看到删除尾随斜杠有利于 SEO,因此我遵循了以下规则:

RewriteRule ^(.+)/$ /$1 [R=301,L]

我认为 301 重定向可能会影响性能,但这不是我的问题......

问题是,当我尝试访问现有子目录的 index.php 时,删除尾随斜杠会导致循环,如下所示:http://mysite.com/a-real/directory/

据我了解,mod_rewrite 尝试删除尾随斜杠,但在这种情况下它不应该这样做。

我该如何解决这个问题?我敢打赌这是一个相当简单的解决方案,尽管超出了我的知识范围。

答案1

最简单的解决方案可能是告诉 .htaccess 如果文件或目录存在则不要重定向

将以下两行添加到条件中以防止出现这种情况

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

(如果您使用符号链接目录/文件,也可以添加 -l)

另外,正如您所建议的,删除 301,因此您的完整 htaccess 将是:

Options +FollowSymLinks
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.+)/$ /$1 [L] 

答案2

你可能应该看看mod_dir

当服务器收到 URL 请求时,http://servername/foo/dirname如果 dirname 是目录,则会发出“尾部斜杠”重定向。目录需要尾部斜杠,因此 mod_dir 会发出到 的重定向http://servername/foo/dirname/

此模块可能会在您删除它之后再次添加斜线,等等。您可以使用DirectorySlash指示。

相关内容