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

基本上,我们今天在客户端站点上进行了重大更新,并且需要在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

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

其他提示

我强烈怀疑这可能是由于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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top