SSL-Redirect für Website hinter Loadbalancer

Webseiten, die eine sichere Kommunikation erfordern, sind auf ein SSL-Zertifikat angewiesen. Ohne SSL-Zertifikat werden die Daten (z.B. Passwörter, PIN und TAN beim Onlinebanking, etc.) im Klartext übertragen und können dadurch problemlos abgehört werden. Eine SSL-Verbindung erkennt man am einfachsten am vorgestellten „https://“ vor einer Website-URL.

Hat man eine Website mit einem SSL-Zertifikat und möchte eine automatische Weiterleitung auf die „https://“-Version einrichten, wenn nur die „http://“ aufgerufen wird, so gibt es verschiedene Möglichkeiten. Probleme kann man dann bekommen, wenn die Website hinter einem Load Balancer oder Reverse Proxy sitzt, der die SSL-Verbindung terminiert.

Hinter einem entsprechenden Load Balancer oder Reverse Proxy ist beispielsweise die PHP-Variable $_SERVER[‚HTTPS‘] leer, selbst wenn die Seite über eine HTTPS-Verbindung aufgerufen wird. Laut Definition ist $_SERVER[‚HTTPS‘] nur dann leer, wenn die Seite über HTTP aufgerufen wird. Wird sie über HTTPS aufgerufen, sollte sie einen Wert enthalten.

Das bedeutet, dass eine PHP-Weiterleitung in diesem Stil niemals funktionieren wird, sondern in einer Endlos-Weiterleitungsschleife endet:

if(APP_HTTPS == 1 && $_SERVER['HTTPS'] != 'on'){
  header('Location: '.APP_URL);
}
elseif(APP_HTTPS == 0 && $_SERVER['HTTPS'] == 'on'){
  header('Location: '.APP_URL);
}

Eine Alternative ist die Weiterleitung per .htaccess-Datei. Normalerweise sähe eine entsprechende .htaccess-Datei, die von HTTP auf HTTPS weiterleitet, in etwa so aus:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Doch aufgrund des Load Balancers oder Reverse Proxies klappt auch diese Lösung nicht. Eine funktionierende Lösung hingegen ist:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

Diese sollte auch mit dem Load Balancer oder Reverse Proxy klarkommen, so dass wenn http://www.example.com aufgerufen wird, stattdessen zu https://www.example.com weitergeleitet wird.

Schreibe einen Kommentar