这是我的规则:
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,但是,某些共享主机由于某种原因启用了此功能。