2009-10-28 72 views
0

这是一个非常奇怪的问题,我只希望我能够清楚地解释它。htaccess重写不适用于所有规则

基本上,我们今天做一个客户端站点的一次重大更新,并在需要更新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时,我们得到了404s。某处仍然将媒体映射到media.php - 并忽略重写规则。

奇怪的是 - 文件中的所有其他重写规则工作正常 - 并且其中大约有20个左右。

我们已经跟踪了虚拟主机和其他配置文件,但无法找到对媒体或其他破碎重定向的引用(总共三个) - 所以我们被难倒了。

+0

您是否重新启动了网络服务器? – Gumbo 2009-10-28 09:40:30

+0

是的,我们做到了 - 尽管这通常不会影响目录级别的htaccess(并且它不会) – HorusKol 2009-10-28 10:57:32

+0

但是,在.htaccess文件中使用mod_rewrite时,每个目录路径前缀会从请求URI中删除,因此也需要从模式中删除。所以给定的规则不应该在.htaccess文件中工作。 – Gumbo 2009-10-29 06:38:02

回答

1

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

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。

+0

有一些好点 - 不幸的是这是一个古老的遗留网站,到目前为止,我一直非常关注由以前的开发人员制定的模式(在“尚未破坏以确保尚未修复”的方法之后)。 原来,问题是MultiViews被启用......现在我需要弄清楚禁用它是否“安全”。 – HorusKol 2009-10-28 22:30:55