htaccess重写不适用于所有规则

时间:2009-10-28 04:02:55

标签: apache .htaccess mod-rewrite apache2 rewrite

这是一个非常奇怪的问题,我希望我能清楚地解释它。

基本上,我们今天在客户端站点上进行了重大更新,并且需要在htaccess中更新一些重写规则以容纳新结构等...

所以,我们最初的地方有:

RewriteRule ^/resources/?$  index.php?id=resources
RewriteRule ^/media/?$      media.php

我们改为:

RewriteRule ^/resources/?$  index.php?id=resources
RewriteRule ^/media/?$      index.php?id=media

但是当我们访问http://www.example.com/media时 - 它正在显示旧的媒体页面。然后,当我们从文档根目录中删除旧的media.php时,我们得到了404。某处某处仍在映射/媒体到media.php - 而忽略了重写规则。

奇怪的是 - 文件中的所有其他重写规则都运行良好 - 那里大约有20个左右。

我们已经跟踪了vhost和其他配置文件,但找不到任何对媒体或其他破坏重定向的引用(总共三个) - 所以我们很难过。

2 个答案:

答案 0 :(得分:2)

我强烈怀疑这可能是由于AcceptPathInfo,在我看来是Apache错误功能。默认情况下,我相信它是在PHP作为处理程序的地方打开的。

尝试添加到.htaccess,或者最好是你的httpd.conf(并重启):

AcceptPathInfo Off

请参阅:http://httpd.apache.org/docs/2.2/mod/core.html#acceptpathinfo

-

一些要点:

当您找到匹配项时,应确保RewriteRules始终以[L]结尾 - 这将有助于调试。 E.g:

RewriteRule ^/media/?$      index.php?id=media [L]

此外,您可以通过组合相似规则来减少规则数量; e.g:

RewriteRule ^/(media|resources)/?$  index.php?id=$1 [L]

我个人认为使用/?在你的上半部分结束时并不好,因为这意味着两个URL都可以工作,没有重定向,这意味着你没有一个“正确”的确定的URL。我会个人使用:

RewriteRule ^/(media|resources)/$  index.php?id=$1 [L]
RewriteRule ^/(media|resources)$ /$1/ [L,R]

换句话说,唯一资源应该有一个单一的,规范的(确定的)URL。

答案 1 :(得分:1)

禁用站点.htaccess中的MultiViews选项修复了问题 - 这似乎是启用了在重写规则之前处理的内容协商。