我正在尝试使用 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.