【发布时间】:2011-10-15 05:57:11
【问题描述】:
我正在尝试构建一个带有一些重写规则的 .htaccess 文件,并且想知道在处理我的请求时实际包含哪些变量。无论如何,当 Apache 处理请求时,它们的值会是什么?
例如打印%{HTTP_USER_AGENT}的内容
【问题讨论】:
我正在尝试构建一个带有一些重写规则的 .htaccess 文件,并且想知道在处理我的请求时实际包含哪些变量。无论如何,当 Apache 处理请求时,它们的值会是什么?
例如打印%{HTTP_USER_AGENT}的内容
【问题讨论】:
当然。创建这种 .php 文件(echo.php):
<?php
phpinfo(INFO_VARIABLES);
?>
在 .htaccess 中添加这条规则:
RewriteEngine On
RewriteCond %{REQUEST_URI} !echo.php
RewriteRule .* echo.php?ua=%{HTTP_USER_AGENT}&https=%{HTTPS} [L]
如有必要,添加更多参数。
现在调用任何 URL 并检查输出(GET 参数应该在表格的顶部)。
但是,TBH,几乎所有这些信息都由 Apache 接收,并且无论如何都可供 PHP 使用:查看$_SERVER。
【讨论】:
!echo.php?这不是否定吗?
[L] 标志不会完全停止重写过程 - - 仅当前迭代/步骤 - 至少在当时 - 参见 stackoverflow.com/a/6800150/783119)。
是的,可以通过.htaccess 输出请求变量。
您可以通过“破解”自定义错误状态消息来做到这一点。只要您将 AllowOverride 设置为 FileInfo,您就可以在 .htaccess 文件中设置并触发custom error response,并在输出中使用所需的变量:
ErrorDocument 404 "Request: %{THE_REQUEST} Referrer: %{HTTP_REFERER} Host: %{HTTP_HOST}"
RewriteRule ^ - [L,R=404]
作为参考,Apache 文档中提供了list of available variables。
有趣的是,您不限于使用 400 或 500 个错误状态来覆盖错误响应。您甚至可以覆盖状态 200“ErrorDocument”。这意味着您可以做更多的事情,而不仅仅是输出变量来使用这个技巧进行故障排除。在它周围加上一个<If> 标签,你就有了一个文档!
<If "%{REQUEST_URI} =~ /compliance.html$/">
ErrorDocument 200 "<html><body><h1>Yes, Max. Those were geeks.</h1></body>"
RewriteRule ^ - [L,R=200]
</If>
【讨论】:
在不改变路由行为(无 404 或重定向)的情况下实现此目的的另一种方法是将所需值作为响应标头发送。
RewriteRule .* - [ENV=REQUEST_URI:%{REQUEST_URI}]
Header set x-request-uri %{REQUEST_URI}e
然后你可以看到curl -I的输出
$ curl -I http://localhost:8095/api/my/request/uri
...
x-request-uri: /api/my/request/uri
您的路线仍然会到达它应该去的地方,但是您会得到一个带有您想要的值的响应标头
【讨论】:
RewriteRule .* - [ENV=MYVAR:AAAA],那么Header set x-request-uri %{MYVAR}e 对我来说只会打印“(null)”,可能是因为(stackoverflow.com/q/19362746)“SetEnv 指令在请求处理过程中运行延迟,这意味着 SetEnvIf 和 RewriteCond 等指令不会查看用它设置的变量。” Setting Environment Variables