是否可以在.htaccess文件中输出任何或所有可用变量?

时间:2011-07-28 15:27:50

标签: apache .htaccess

我正在尝试使用一些重写规则构建一个.htaccess文件,并且想知道在处理我的请求时实际包含的几个变量。有没有看到Apache处理请求时它们的值是什么?

E.g。打印%{HTTP_USER_AGENT}

的内容

3 个答案:

答案 0 :(得分:16)

不确定。创建这种.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

答案 1 :(得分:1)

是的,可以通过.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>

答案 2 :(得分:0)

在不改变路由行为(无 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

您的路线仍将前往它应该去的地方,但您会收到一个包含您想要的值的响应标头