Заголовок unset, похоже, не работает с Apache 2.4.10 и PHP-FPM

Заголовок unset, похоже, не работает с Apache 2.4.10 и PHP-FPM

Я пытаюсь передать заголовки из PHP-кода обратно в Apache AccessLog с помощью HTTP-заголовков, например так:

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 с использованием следующей строки идентификатор пользователя не вставляется в журнал и не удаляется из HTTP-заголовков клиента.

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

Первоначально я использовал , apache_noteно это доступно только с mod_php. Я нашел вышеприведенное как решение для передачи данных из PHP в Apache/php-fpm или nginx, но, похоже, оно не работает с php-fpm.

Нужно ли что-то включить или настроить, чтобы Header unsetphp-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

Это неудачная часть API Apache, которая проникает в mod_headers — заголовки могут находиться в двух местах в зависимости от того, должны ли они сохраняться для ответов об отсутствии успеха.

решение2

Судя по устранению неполадок в комментариях, я думаю, что это ошибка — заголовки, возвращаемые из , mod_proxy_fcgiпо-видимому, каким-либо образом недоступны mod_headersи объединяются с данными из mod_headersпосле его обработки.

На данный момент, если вам нужно, чтобы это поведение работало правильно, возможно, стоит рассмотреть nginx или lighttpd, или разместить экземпляр HAProxy или Varnish перед Apache для правильного ведения журнала и обработки заголовков?

решение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.

Связанный контент