什么导致了 mod_rewrite 出现这种完全奇怪的行为?

什么导致了 mod_rewrite 出现这种完全奇怪的行为?

这是我的规则:

RewriteRule ^user/(\d+)$ rewrite.php?id=$1

这会重定向,但未$_GET['id']设置。如果我将上述规则更改为:

RewriteRule ^anything/(\d+)$ rewrite.php?id=$1

它有效。为什么一个有效,而另一个无效?

以下是更多信息:

  • 没有名为user
  • 层次结构中唯一的其他 .htaccess 文件是空白的。
  • anything可以被 以外的任何东西取代user

更新:我检查了一下rewritelog,它是空的。

答案1

我终于找到了问题的原因......显然(而且我找不到任何记录)如果你有一个文件(在本例中是 PHP)与第一个虚拟目录同名重写规则不起作用。(重定向循环、缺少参数等)

例如,以下规则:

#RewriteRule ^user/(\d+)$ user.php?id=$1 [L]

如果有名为 user.php 的文件,则会出现故障与 PHP 文件位于同一目录中

答案2

如果启用了 (mod_negotiation 的一部分),则会发生这种情况MultiViews。如果启用了 MultiViews 并且您请求/user,其中/user.php存在物理文件,则 mod_negotiation 会触发 的内部子请求users.php(它会“搜索”将返回正确 mime 类型的适当文件)。

您需要在.htaccess文件中禁用 MultiViews:

Options -MultiViews

Apache 默认禁用 MultiViews,但是,某些共享主机由于某种原因启用了此功能。

相关内容