Header unset scheint mit Apache 2.4.10 und php-fpm nicht zu funktionieren

Header unset scheint mit Apache 2.4.10 und php-fpm nicht zu funktionieren

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_phpwird 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_noteaber 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 unsetunter 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_fcgischeinen mod_headersin keiner Weise verfügbar zu sein und werden mod_headersnach 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 unsetsollten 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}nals 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.

verwandte Informationen