O cabeçalho não definido parece não funcionar com Apache 2.4.10 e php-fpm

O cabeçalho não definido parece não funcionar com Apache 2.4.10 e php-fpm

Estou tentando passar cabeçalhos do código php de volta para o accesslog do Apache usando cabeçalhos HTTP, assim:

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

Com mod_php, o ID do usuário é inserido no log conforme esperado e o cabeçalho é desdefinido antes de ser enviado ao cliente.

Ao executar via php-fpm, usando a linha a seguir, o ID do usuário não é inserido no log e não é desmarcado nos cabeçalhos HTTP do cliente.

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

Originalmente eu estava usando, apache_notemas isso só está disponível com mod_php. Encontrei o acima como uma solução para passar dados de PHP para Apache/php-fpm ou nginx, mas parece não funcionar com php-fpm.

Há algo que preciso ativar ou configurar para Header unsetfuncionar no php-fpm?

Configuração de host virtual:

<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>

Responder1

mod_proxy_fcgi adiciona cabeçalhos de resposta a r->err_headers_out o que significa que você deve usar pelo menos:

Header unset X-Userid always

Mas não há razão para não usar ambos:

Header always unset X-Userid
Header unset X-Userid

Esta é uma parte infeliz da API Apache que se transforma em mod_headers - os cabeçalhos podem residir em dois lugares, dependendo se devem persistir em respostas sem sucesso.

Responder2

Pela solução de problemas nos comentários, acho que isso é um bug - os cabeçalhos que retornam mod_proxy_fcgiparecem estar indisponíveis mod_headersde alguma forma e estão sendo combinados com os dados mod_headersapós o processamento.

Por enquanto, se você precisa que esse comportamento funcione corretamente, talvez dê uma olhada no nginx ou lighttpd, ou coloque uma instância HAProxy ou Varnish na frente do Apache para fazer o registro e a manipulação do cabeçalho da maneira certa?

Responder3

Esta questão é antiga, mas pode ajudar alguém que procura a solução final:

Como Covener apontou, Header unsetvocê também deve definir a condição 'sempre' ao definir a nota:

Header always note X-Userid userid
Header always unset X-Userid

Use %{userid}ncomo espaço reservado para a variável (n da 'nota interna' ou seja, onde mod_headers salva o valor da variável.

Dedocumentos:

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.

informação relacionada