Php-Fpm

未設置的標頭似乎不適用於 apache 2.4.10 和 php-fpm

  • August 31, 2017

我正在嘗試使用 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 webmaster@site.dev
   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 這意味著您至少應該使用:

Header unset X-Userid always

但是沒有理由不同時使用兩者:

Header always unset X-Userid
Header unset X-Userid

這是 Apache API 中一個不幸的部分,它滲入 mod_headers —— 標頭可以存在於兩個地方,這取決於它們是否要為不成功的響應而持續存在。

從評論中的故障排除來看,我認為這是一個錯誤——返回的標頭mod_proxy_fcgi似乎無法以mod_headers任何方式使用,並且正在與mod_headers處理後的數據相結合。

現在,如果您需要這種行為正常工作,也許看看 nginx 或 lighttpd,或者在 Apache 前面拍一個 HAProxy 或 Varnish 實例,以正確的方式進行日誌記錄和標頭操作?

引用自:https://serverfault.com/questions/646773