mod_rewrite删除结尾斜杠导致循环

我有一个网站使用mod_rewrite制作漂亮的url…我到处阅读删除结尾的斜杠对search引擎优化很好,因此我遵循规则:

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

我认为301redirect可能会影响性能,但这不是我的问题…

事情是,当我尝试访问一个EXISTING子目录的index.php像这样删除尾部的斜杠导致我循环: http : //mysite.com/a-real/directory/

据我了解,mod_rewrite试图删除后面的斜杠,但在这种情况下,它不是假设。

我怎样才能解决这个问题? 我敢打赌,这是一个相当简单的解决scheme,但超出我的知识。

最简单的解决scheme可能是告诉.htaccess如果文件或目录存在不redirect

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

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

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

另外,正如你所build议的,放弃301,所以你的完整htaccess将是:

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

你应该看看mod_dir的文档

当服务器收到URL http://servername/foo/dirname其中dirname是目录)的请求时,会发出“尾部斜线”redirect。 目录需要一个尾部斜线,所以mod_dir发出一个redirect到http://servername/foo/dirname/

这个模块可能在删除它之后再次添加一个斜杠等等。你可以使用DirectorySlash指令来禁止这个行为。