Header unset 似乎不适用于 apache 2.4.10 和 php-fpm

Header unset 似乎不适用于 apache 2.4.10 和 php-fpm

我正在尝试使用 HTTP 标头将标头从 php 代码传回 apache accesslog,如下所示:

Header note X-Userid userid
Header unset X-Userid

LogFormat "%h %l %{userid}n %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined_with_php_userid
CustomLog /var/log/apache2/access_log combined_with_php_userid

使用mod_php,用户 ID 会按预期插入到日志中,并且在发送到客户端之前会取消设置标头。

通过 php-fpm 运行时,使用以下行,用户 ID 不会插入到日志中,也不会在客户端 HTTP 标头中取消设置。

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9001/var/html/$1

最初我使用的是,apache_note但这仅适用于mod_php。我发现上述方法是将数据从 PHP 传递到 Apache/php-fpm 或 nginx 的解决方案,但它似乎不适用于 php-fpm。

我需要启用或设置什么东西才能Header unset在 php-fpm 下工作吗?

虚拟主机配置:

<VirtualHost *:80>
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9001/web/ee2/sites/site.com/$1
    ServerAdmin [email protected]
    DocumentRoot /web/ee2/sites/site.com
    ServerName site.dev

    Header note X-Userid userid
    Header unset X-Userid

    ErrorLog  /var/log/apache2/site.dev-error_log
    LogFormat "%h %l %{userid}n %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined_with_php_userid
    # also tried: # LogFormat "%h %l %{X-Userid}i %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined_with_php_userid
    CustomLog /var/log/apache2/searchenginenews.com-access_log combined_with_php_userid

    <Directory /web/ee2/sites/site.com>
        AllowOverride All
        Require all granted
    </Directory>

</VirtualHost>

答案1

mod_proxy_fcgi 将响应头添加到 r->err_headers_out,这意味着您至少应该使用:

Header unset X-Userid always

但没有理由不同时使用它们:

Header always unset X-Userid
Header unset X-Userid

这是 Apache API 中一个令人遗憾的部分,它渗透到了 mod_headers 中——标头可以存在于两个地方,取决于它们是否要持续保留以应对非成功响应。

答案2

从评论中的故障排除来看,我认为这是一个错误 - 返回的标题mod_proxy_fcgi似乎无法mod_headers以任何方式使用,并且正在与mod_headers处理后的数据相结合。

现在,如果您需要这种行为正常工作,也许看看 nginx 或 lighttpd,或者在 Apache 前面放置一个 HAProxy 或 Varnish 实例以正确的方式进行日志记录和标头操作?

答案3

这个问题很老了,但可能会帮助那些寻找最终解决方案的人:

正如 covener 指出的那样,Header unset您在设置注释时也应该将条件设置为“始终”:

Header always note X-Userid userid
Header always unset X-Userid

用作%{userid}n变量的占位符(n 来自“内部注释”,即 mod_headers 保存变量的值的地方)。

来自文档

Header [condition] note header value

The optional condition argument determines which internal table 
of responses headers this directive will operate against. Despite the 
name, the default value of onsuccess does not limit an action to 
responses with a 2xx status code. Headers set under this condition are 
still used when, for example, a request is successfully proxied or 
generated by CGI, even when they have generated a failing status code.

相关内容