Wymuś HTTPS za pomocą mod_rewrite, w tym proxy SSL

9

Mam serwer, który odbiera część ruchu z modułu równoważenia obciążenia kończącego protokół SSL - w takim przypadku przychodzi on jako HTTP przez port 80 z komunikatem http_x_forwarded_proto= „https”

Chcę reguły mod_rewrite, która zezwala tylko na bezpośredni ruch HTTPS lub przesyłany dalej ruch HTTPS.

Mam to do tej pory:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:http_x_forwarded_proto} != https
RewriteCond %{HTTP:http_x_forwarded_proto} != HTTPS
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

ale dostaję

RewriteCond: złe ograniczniki flagi

błąd.

Co muszę poprawić, aby to działało i czy jest to najlepsze podejście?

Yarin
źródło

Odpowiedzi:

16

Problemem była biała spacja po „! =”:

Wersja robocza:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

zdradliwy...

Yarin
źródło
Nie jestem pewien, czy jeśli SSL zostanie odciążony, zmienna HTTPS zostanie kiedykolwiek ustawiona. W każdym razie w mojej sytuacji działało dobrze bez pierwszego testu.
wurtel
1

Jeśli masz moduł równoważenia obciążenia, zawsze używaj protokołu SSL podczas komunikacji z serwerem, musisz pominąć pierwsze sprawdzenie, ponieważ zawsze będzie to prawdą. (Jeśli odciążasz SSL w module równoważenia obciążenia, pierwsza linia jest zawsze prawdziwa, chyba że komuś uda się bezpośrednio trafić twój serwer za pomocą SSL, w którym to przypadku będzie to fałsz i nie spróbuje przekierować, ponieważ X-Forwarded-Protobędzie brakować).

Kod, którego używam, ponieważ zawsze komunikujemy się za pomocą protokołu SSL między ELB a serwerem WWW:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Loren
źródło