如果文件夹存在,mod_rewrite将创建301而不是透明重定向

时间:2010-08-13 18:49:59

标签: apache .htaccess mod-rewrite apache2

我在这里遇到一个小问题。 我使用一个简单的规则将所有请求重定向到脚本,除了一些带有静态内容的文件夹:

RewriteEngine On
RewriteCond $1 !^(templates|css|js|uploads)/(.*)$
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]

大多数情况下,重定向是好的和透明的。 但是如果匹配URL的文件夹存在,如果我没有放最后的“/”,我将有301重定向。

示例:(文件夹库不存在,但mods确实存在)

  • ht * p:// localhost / test / gallery / - >行
  • ht * p:// localhost / test / mods / - >行
  • ht p:// localhost / test / mods - > 301重定向到ht p:// localhost / test / mods /?url = mods

我在所有apache2服务器上都遇到过这个问题(测试过Fedora,Debian,Windows)。

有人知道如何解决这个问题? 感谢

1 个答案:

答案 0 :(得分:1)

这是由DirectorySlash指令引起的,该指令将在执行重写后执行外部重定向,这会带来意外的后果,即使用添加的查询字符串。

您可以关闭DirectorySlash,但不建议出于文档中描述的原因。在这种情况下,首选选项可能只是执行mod_dir的工作,在执行规则之前重定向到相应的斜杠终止URL。在现有规则之上的这样的事情应该有效:

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^.*$ /$0/ [R=301,L]