这是一个非常奇怪的问题,我希望我能清楚地解释它。
基本上,我们今天在客户端站点上进行了重大更新,并且需要在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和其他配置文件,但找不到任何对媒体或其他破坏重定向的引用(总共三个) - 所以我们很难过。
答案 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选项修复了问题 - 这似乎是启用了在重写规则之前处理的内容协商。