
Ich versuche, Header aus dem PHP-Code mithilfe von HTTP-Headern zurück an das Apache-Zugriffsprotokoll zu übergeben, und zwar etwa so:
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
Mit mod_php
wird die Benutzer-ID wie erwartet in das Protokoll eingefügt und der Header wird vor dem Senden an den Client aufgehoben.
Beim Ausführen über php-fpm wird mithilfe der folgenden Zeile die Benutzer-ID nicht in das Protokoll eingefügt und in den HTTP-Headern des Clients nicht aufgehoben.
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9001/var/html/$1
Ursprünglich habe ich verwendet, apache_note
aber das ist nur mit verfügbar mod_php
. Ich habe das Obige als Lösung zum Übergeben von Daten von PHP an Apache/php-fpm oder nginx gefunden, aber es scheint mit php-fpm nicht zu funktionieren.
Muss ich etwas aktivieren oder einstellen, damit es Header unset
unter php-fpm funktioniert?
Virtuelle Host-Konfiguration:
<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>
Antwort1
mod_proxy_fcgi fügt Antwortheader zu r->err_headers_out hinzu, was bedeutet, dass Sie mindestens Folgendes verwenden sollten:
Header unset X-Userid always
Es gibt jedoch keinen Grund, nicht beides zu verwenden:
Header always unset X-Userid
Header unset X-Userid
Dies ist ein bedauerlicher Teil der Apache-API, der in mod_headers eindringt – Header können an zwei Stellen vorhanden sein, je nachdem, ob sie für erfolglose Antworten bestehen bleiben sollen.
Antwort2
Aufgrund der Fehlerbehebung in den Kommentaren halte ich es für einen Fehler. Die zurückgegebenen Header mod_proxy_fcgi
scheinen mod_headers
in keiner Weise verfügbar zu sein und werden mod_headers
nach der Verarbeitung mit den Daten von kombiniert.
Wenn dieses Verhalten für Sie vorerst korrekt funktionieren soll, sehen Sie sich vielleicht nginx oder lighttpd an oder setzen Sie eine HAProxy- oder Varnish-Instanz vor Apache, um die Protokollierung und Header-Manipulation richtig durchzuführen?
Antwort3
Diese Frage ist alt, kann aber jemandem helfen, der nach der endgültigen Lösung sucht:
Wie Covener bereits erwähnt hat, Header unset
sollten Sie beim Festlegen der Notiz auch die Bedingung „immer“ festlegen:
Header always note X-Userid userid
Header always unset X-Userid
Verwenden Sie es %{userid}n
als Platzhalter für die Variable (n aus „interner Notiz“, also dort, wo mod_headers den Wert der Variable speichert.
Von demDokumente:
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.