【问题标题】:htaccess rewrite not working for all ruleshtaccess 重写不适用于所有规则
【发布时间】:2010-12-10 17:53:01
【问题描述】:

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

基本上,我们今天对一个客户网站进行了重大更新,需要更新 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 和其他配置文件,但找不到任何对媒体或其他损坏的重定向(总共三个)的引用 - 所以我们很难过。

【问题讨论】:

  • 你重启了网络服务器吗?
  • 是的,我们做到了——尽管这通常不会影响目录级别的 htaccess(而且它没有)
  • 但是当在 .htaccess 文件中使用 mod_rewrite 时,每个目录的路径前缀会从请求 URI 中删除,因此也需要从模式中删除。所以给定的规则根本不应该在 .htaccess 文件中起作用。
  • 抱歉...不确定我们是否完全在同一件事上...该网站的文档根目录中的 .htaccess - 所以重写规则应该有效(现在我已经删除了 MultiViews 选项)。但是对这个文件的更改应该是实时的,不需要重新启动 apache(事实上,关闭 MultiViews 是即时的)

标签: apache .htaccess mod-rewrite apache2 rewrite


【解决方案1】:

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

【讨论】:

  • 其中有一些优点 - 不幸的是,这是一个古老的遗留站点,到目前为止,我一直在遵循以前开发人员制定的架构(遵循“它还不够破坏保证修复”的方法)。但事实证明,问题在于启用了 MultiViews……现在我需要弄清楚禁用它是否“安全”。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    相关资源
    最近更新 更多