1

这是一个很奇怪的问题,我只希望我能解释清楚。

基本上,我们今天对一个客户站点进行了重大更新,并且需要更新 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 映射到 media.php - 并忽略重写规则。

奇怪的是 - 文件中的所有其他重写规则都工作正常 - 那里大约有 20 条左右。

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

4

2 回答 2

2

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

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

AcceptPathInfo Off

见:http ://httpd.apache.org/docs/2.2/mod/core.html#acceptpathinfo

--

几个方面:

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

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

此外,您可以通过组合相似的规则来减少规则的数量;例如:

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

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

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

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

于 2009-10-28T19:50:07.960 回答
2

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

于 2009-11-03T22:11:39.557 回答