【问题标题】:Is it possible to output any or all available variables in a .htaccess file?是否可以在 .htaccess 文件中输出任何或所有可用变量?
【发布时间】:2011-10-15 05:57:11
【问题描述】:

我正在尝试构建一个带有一些重写规则的 .htaccess 文件,并且想知道在处理我的请求时实际包含哪些变量。无论如何,当 Apache 处理请求时,它们的值会是什么?

例如打印%{HTTP_USER_AGENT}的内容

【问题讨论】:

    标签: apache .htaccess


    【解决方案1】:

    当然。创建这种 .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

    【讨论】:

    • 谢谢 - 我知道你可以从 PHP 获得所有这些东西。我只是想看看一些变量的内容是什么(HTTP_USER_AGENT 实际上不是其中之一)并且我没有想到要做你在那里所做的事情。 :)
    • 问题是“是否可以输出.htaccess的环境变量?”我想正确的答案是如何在 apache 日志中记录变量的值,而不是如何在 PHP 中输​​出它。此外,这是假设当前 apache 服务器配置能够提供 PHP 脚本
    • 为什么会有感叹号,又名!echo.php?这不是否定吗?
    • @felwithe 您的观察是正确的。我现在不记得所有细节了(因为我已经快 5 年没有使用 Apache/mod_rewrite 了).. 但据我所知,这是为了防止无休止的重写循环([L] 标志不会完全停止重写过程 - - 仅当前迭代/步骤 - 至少在当时 - 参见 stackoverflow.com/a/6800150/783119)。
    【解决方案2】:

    是的,可以通过.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”。这意味着您可以做更多的事情,而不仅仅是输出变量来使用这个技巧进行故障排除。在它周围加上一个&lt;If&gt; 标签,你就有了一个文档!

    <If "%{REQUEST_URI} =~ /compliance.html$/">
        ErrorDocument 200 "<html><body><h1>Yes, Max. Those were geeks.</h1></body>"
        RewriteRule ^ - [L,R=200]   
    </If>
    

    【讨论】:

      【解决方案3】:

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

      您的路线仍然会到达它应该去的地方,但是您会得到一个带有您想要的值的响应标头

      【讨论】:

      • 不幸的是,这似乎可行,因为 REQUEST_URI 没有改变;如果我尝试任意变量RewriteRule .* - [ENV=MYVAR:AAAA],那么Header set x-request-uri %{MYVAR}e 对我来说只会打印“(null)”,可能是因为(stackoverflow.com/q/19362746)“SetEnv 指令在请求处理过程中运行延迟,这意味着 SetEnvIf 和 RewriteCond 等指令不会查看用它设置的变量。” Setting Environment Variables
      猜你喜欢
      • 2019-09-27
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 2023-02-11
      • 2011-03-18
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多