【发布时间】:2017-06-14 02:54:39
【问题描述】:
如果查询字符串包含 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]
回显的 url 本身就是“echo.php”。 这是预期的行为吗?如果是,为什么?
【问题讨论】:
-
您可以尝试添加
[B]标志来转义反向引用。这可能是未转义添加的 URL 的问题。无论如何,您都可以通过REQUEST_URI环境变量获取URL,您不需要将其传递进去。QUERY_STRING和REMOTE_ADDR也是如此。在 PHP 中,它们位于$_SERVER数组中,例如$_SERVER['REQUEST_URI']。此外,如果您确实想以这种方式执行此操作,则需要添加ENV,所以%{ENV:REMOTE_ADDR},因为它与您正在访问的环境变量相同。但是请尝试使用[B]标志来解决您的问题中提到的问题。 -
添加
[B]标志没有帮助。感谢您提供有关如何在 PHP 脚本中获取 URL 的提示,但我更感兴趣的是回答 mod_rewrite 如何工作以及为什么它会以这种奇怪的方式运行,而不是如何回显 URL。 -
@SuperDuperApps 您写道:“无论如何,您都可以通过 REQUEST_URI 环境变量获取 URL”,但是如果我有超过 1 次重写,我无法在重写过程中获取 URL 的当前状态规则,所以我需要按照我的方式传递它。
-
您可以通过将
LogLevel rewrite:trace6添加到您的主配置然后检查错误日志(或 1 到 8 之间的另一个数字以获取更少或更多信息)来了解正在发生的事情。要在 PHP 中获取最后一个重写的 URL,请使用$_SERVER['REDIRECT_URL']。