mod_rewrite重写规则是否匹配取决于替换位置?

时间:2017-06-12 11:39:00

标签: mod-rewrite url-rewriting

如果查询字符串包含DEBUG短语,我尝试回显.htaccess中重写的URL的当前状态:

RewriteCond %{QUERY_STRING} DEBUG
RewriteRule .+ echo.php?ip=%{REMOTE_ADDR}&url=$0&query=%{QUERY_STRING} [L]

我的echo.php脚本回应了预期的URL。

但奇怪的是,当我将参数的顺序改为:

RewriteRule .+ echo.php?url=$0&ip=%{REMOTE_ADDR}&query=%{QUERY_STRING} [L]

echoed url是“echo.php”本身。 这是预期的行为,如果是这样,为什么?

1 个答案:

答案 0 :(得分:0)

当我测试时,我不会得到你所说的不同行为。当我以任何方式使用规则时,我会在访问echo.php时获得example?DEBUG作为网址。这是因为.htaccess中的规则将保持循环(因为整个目录处理在重写后再次开始,包括重写规则),直到URL不变。因此,由于您匹配.+,因此除非先前的某些规则妨碍并在达到您的规则之前结束该迭代的处理,否则您将始终使用echo.php

您可以通过向规则添加[END]标志来证明这一点,该标志会停止任何进一步的mod_rewrite处理,然后您将获得您期望的行为。您所看到的差异必须归因于您之前的某些规则。

如评论中所述,调试mod_rewrite的更好方法是使用LogLevel rewrite:traceX选项,X是1到8之间的数字.3是一个好的起点,如果没有足够的信息,从那里增加。当您向8增加时,有一个很多的信息。您只能在主配置中启用它。见the documentation。确保再次将其关闭,因为所有日志记录都会影响性能。它不会干扰任何早期的LogLevel指令。