Назад | Перейти на главную страницу

Не задан заголовок, похоже, не работает с apache 2.4.10 и php-fpm

Я пытаюсь передать заголовки из php-кода обратно в журнал доступа apache, используя заголовки 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 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

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

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

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

Это старый вопрос, но он может помочь тем, кто ищет окончательное решение:

Как отметил Ковенер с 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.