RequestHeader mit Apache-Umgebungsvariable

13

Ich habe Apache als Load Balancer eingerichtet. Ich wollte, dass Apache den X-Forwarded-Proto-Header setzt, aber das funktioniert nicht:

RequestHeader set X-Forwarded-Proto "%{SERVER_PROTOCOL}e"

Der Header wird auf null gesetzt. Irgendeine Idee warum?

John Crenshaw
quelle

Antworten:

15

Spät aber immer noch habe ich mich gerade mit dem gleichen Thema beschäftigt, und das hat bei mir funktioniert:

RequestHeader set X_FORWARDED_PROTO 'https' env=HTTPS

In der Dokumentation heißt es:

Wenn die RequestHeader-Direktive mit dem Argument add, append oder set verwendet wird, kann ein viertes Argument verwendet werden, um Bedingungen anzugeben, unter denen die Aktion ausgeführt wird. Wenn die im Argument env = ... angegebene Umgebungsvariable vorhanden ist (oder wenn die Umgebungsvariable nicht vorhanden ist und env =! ... angegeben ist), wird die von der RequestHeader-Direktive angegebene Aktion wirksam. Andernfalls hat die Direktive keine Auswirkung auf die Anfrage.

Während die HTTPS-Umgebungsvariable nur festgelegt wird, wenn die Anforderung über SSL erfolgt.

iNecas
quelle
3
Laut en.wikipedia.org/wiki/List_of_HTTP_header_fields sollte der Header eher Bindestriche als Unterstriche enthalten: RequestHeader set X-Forwarded-Proto 'https' env = HTTPS Dies ist auch der Header, den Amazon ELB sendet.
Loevborg
9

Das willst du nicht; Es würde Ihren Header auf "HTTP / 1.1" setzen (selbst bei einer https-Anfrage) - wahrscheinlich nicht besonders nützlich für alles, was Sie weiterleiten.

Sie haben verschiedene VirtualHost-Blöcke für http und https. einfach die RequestHeadereinstellung in jedem hardcode .

<VirtualHost *:80>
    RequestHeader set X-Forwarded-Proto "http"
    ...
</VirtualHost>

<VirtualHost *:443>
    RequestHeader set X-Forwarded-Proto "https"
    ...
</VirtualHost>
Shane Madden
quelle
1
Dies beantwortet immer noch nicht die Frage, warum die Umgebungsvariablen nicht funktionieren. Ich wollte auch den Port und einige andere Werte beibehalten, von denen einige nicht so hart codiert werden können.
John Crenshaw
3

Sie können dieses Problem beheben, indem Sie das earlySchlüsselwort verwenden:

RequestHeader set X-Forwarded-Proto "https" early

Andernfalls können Sie das tun, was John Crenshaw vorgeschlagen hat, und zwar RewriteRuleanstelle von ProxyPassAnweisungen.

docwhat
quelle
1
Wie kann ich debuggen, ob Apache diesen Header tatsächlich sendet?
Codecowboy
2

Die Ursache gefunden. Es stellt sich heraus, dass es sich um eine Frage der Betriebsordnung handelt. mod_rewrite ist für die Bereitstellung dieser Umgebungsvariablen verantwortlich, Apache verarbeitet sie jedoch erst, nachdem ProxyPass-Anforderungen verarbeitet wurden. Bis dahin wird nur null gesetzt. Die einzige Problemumgehung scheint darin zu bestehen, das Proxying über mod_rewrite durchzuführen.

Siehe http://www.gossamer-threads.com/lists/apache/users/267160?do=post_view_threaded#267160

John Crenshaw
quelle