我正在尝试使用 HTTP 标头将标头从 php 代码传递回 apache 访问日志,如下所示:
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
,用户标识按预期插入到日志中,并且在发送到客户端之前未设置标头。
通过 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>
mod_proxy_fcgi 将响应头添加到 r->err_headers_out 这意味着您至少应该使用:
但是没有理由不同时使用两者:
这是 Apache API 中一个不幸的部分,它渗入 mod_headers —— 标头可以存在于两个地方,这取决于它们是否要为不成功的响应而持续存在。
从评论中的故障排除来看,我认为这是一个错误——返回的标头
mod_proxy_fcgi
似乎无法以mod_headers
任何方式使用,并且正在与mod_headers
处理后的数据相结合。现在,如果您需要这种行为正常工作,也许看看 nginx 或 lighttpd,或者在 Apache 前面拍一个 HAProxy 或 Varnish 实例,以正确的方式进行日志记录和标头操作?
这个问题很老,但可能有助于寻找最终解决方案的人:
正如 covener 指出的那样,
Header unset
您还应该在设置注释时设置条件“始终”:%{userid}n
用作变量的占位符(来自 mod_headers 的“内部注释”中的 n 保存变量的值。从文档: