RequestHeader ze zmienną środowiskową Apache

13

Mam Apache skonfigurowany jako moduł równoważenia obciążenia. Chciałem, aby apache ustawił nagłówek X-Forwarded-Proto, ale to nie działa:

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

Nagłówek zostaje ustawiony na null. Masz pomysł, dlaczego?

John Crenshaw
źródło

Odpowiedzi:

15

Późno, ale wciąż miałem do czynienia z tym samym problemem i to zadziałało dla mnie:

RequestHeader set X_FORWARDED_PROTO 'https' env=HTTPS

Dokumentacja mówi:

Gdy dyrektywa RequestHeader jest używana z argumentem add, append lub set, można użyć czwartego argumentu, aby określić warunki, w których zostanie podjęte działanie. Jeśli istnieje zmienna środowiskowa określona w argumencie env = ... (lub jeśli zmienna środowiskowa nie istnieje i podano env =! ...), wówczas działanie określone w dyrektywie RequestHeader zostanie zastosowane. W przeciwnym razie dyrektywa nie będzie miała wpływu na wniosek.

Podczas gdy zmienna środowiskowa HTTPS jest ustawiana tylko wtedy, gdy żądanie jest przesyłane przez SSL.

iNecas
źródło
3
Według en.wikipedia.org/wiki/List_of_HTTP_header_fields nagłówek powinien zawierać myślniki, a nie podkreślenia: RequestHeader ustawia X-Forwarded-Proto „https” env = HTTPS Jest to również nagłówek wysyłany przez ELB Amazon.
loevborg
9

Nie chcesz tego; ustawiłby nagłówek na „HTTP / 1.1” (nawet na żądanie https) - prawdopodobnie nie jest to szczególnie przydatne do tego, co przekazujesz.

Masz różne bloki VirtualHost dla http i https; po prostu zakoduj RequestHeaderustawienia w każdym z nich.

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

<VirtualHost *:443>
    RequestHeader set X-Forwarded-Proto "https"
    ...
</VirtualHost>
Shane Madden
źródło
1
To wciąż nie odpowiada na pytanie, dlaczego zmienne środowiskowe nie działają. Chciałem również zachować port i kilka innych wartości, z których niektórych nie da się tak na stałe zakodować.
John Crenshaw,
3

Możesz to naprawić za pomocą earlysłowa kluczowego:

RequestHeader set X-Forwarded-Proto "https" early

W przeciwnym razie możesz zrobić to, co sugerował John Crenshaw, czyli użyć RewriteRulezamiast ProxyPassdyrektyw.

docwhat
źródło
1
Jak mogę debugować, czy apache faktycznie wysyła ten nagłówek?
codecowboy
2

Znaleziono przyczynę. Okazuje się, że jest to kwestia kolejności operacji. mod_rewrite jest odpowiedzialny za dostarczanie tych zmiennych środowiskowych, ale Apache nie przetwarza go, dopóki PO nie obsłuży żadnych żądań ProxyPass. Do tego czasu po prostu wyzeruje. Jedynym obejściem wydaje się być wykonywanie proxy przez mod_rewrite.

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

John Crenshaw
źródło