
Estoy intentando pasar encabezados del código php al registro de acceso de Apache usando encabezados HTTP, así:
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
Con mod_php
, el ID de usuario se inserta en el registro como se esperaba y el encabezado se desactiva antes de enviarlo al cliente.
Cuando se ejecuta a través de php-fpm, utilizando la siguiente línea, el ID de usuario no se inserta en el registro y no se desactiva en los encabezados HTTP del cliente.
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9001/var/html/$1
Originalmente estaba usando apache_note
pero esto solo está disponible con mod_php
. Encontré lo anterior como una solución para pasar datos de PHP a Apache/php-fpm o nginx, pero no parece funcionar con php-fpm.
¿Hay algo que deba habilitar o configurar para que Header unset
funcione en php-fpm?
Configuración 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>
Respuesta1
mod_proxy_fcgi agrega encabezados de respuesta a r->err_headers_out lo que significa que debes usar al menos:
Header unset X-Userid always
Pero no hay razón para no utilizar ambos:
Header always unset X-Userid
Header unset X-Userid
Esta es una parte desafortunada de la API de Apache que se filtra en mod_headers: los encabezados pueden vivir en dos lugares dependiendo de si deben persistir para respuestas que no son exitosas.
Respuesta2
Según la solución de problemas en los comentarios, creo que esto es un error: los encabezados que regresan mod_proxy_fcgi
parecen no estar disponibles mod_headers
de ninguna manera y se combinan con los datos mod_headers
después de que se procesan.
Por ahora, si necesita que este comportamiento funcione correctamente, tal vez mire nginx o lighttpd, o coloque una instancia de HAProxy o Varnish frente a Apache para realizar el registro y la manipulación del encabezado de la manera correcta.
Respuesta3
Esta pregunta es antigua, pero puede ayudar a alguien que busque la solución final:
Como señaló Covener, Header unset
también debe establecer la condición "siempre" al configurar la nota:
Header always note X-Userid userid
Header always unset X-Userid
Úselo %{userid}n
como marcador de posición para la variable (n de la 'nota interna', es decir, donde mod_headers guarda el valor de la variable.
Desde eldocumentos:
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.