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?

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.


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>

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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.