Möchte man eine Webanwendung (Beispielsweise WordPress, Durpal, Magento) hinter einen Apache als Reverse Proxy betreiben, so wird man spätestens bei der Verwendung von SSL vor ein Problem gestellt:
Apache dient als SSL Backend, das heißt, dass das die Kommunikation zum Backend-Server unverschlüsselt erfolgt. Betreibt man nun eine Anwendung, die SSL erzwingt, wird man üblicherweise in einem Endlos-Loop landen.
Die Ursache ist folgende: Während der Client über SSL (HTTPS://…) auf die Anwendung zugreift, sieht der Backender Server nur (HTTP://…) und wird versuchen einen Redirect auf (HTTPS://…) durchzuführen. Für den Client erfogt immer eine Weiterleitung von HTTPS://.. auf HTTPS://… während das Backend immer nur HTTP://.. sieht.
VHost Konfigurieren
Mit eine einzelnen Konfigurationszeile im SSL-Vhost auf dem Proxyserver kann man dieses Problem umgehen:
In die SSL VHost konfiguration fügt man folgenden Zeile ein:
RequestHeader set X-Forwarded-Proto „https“
Das sieht dann Beispielsweise so aus:
#Setze X-Forwarded-Proto auf HTTPS für das Backend
RequestHeader set X-Forwarded-Proto "https"
ServerName example.com
#Notwendig, damit die vollständige URL an das Backend weitergegeben wird.
ProxyPreserveHost on
#Alles was an example.com ankommt, wird an das Backend weitergeleitet
ProxyPass / http://10.0.0.1/ retry=0
ProxyPassReverse / http://10.0.0.1/ retry=0
#Mehr SSL Konfig
…..
Damit enthält der HTTP-Header die Information, dass es sich um einen SSL-Request handelt.
1. Möglichkeit: PHP-Anwendung konfigurieren
Manche PHP-Webanwendungen überprüfen nur den eigentlichen Protocol-Header mit $_SERVER[‚HTTPS‘]. Mit einer kleinen If-Anweisung kann man das Problem einfach umgehen:
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'){
$_SERVER['HTTPS']='on';
}
Der Code prüft dann den vom Proxy veränderten/gesetzten HTTP-Header und setzt das HTTPS Global entsprechend. Dieses Snippet kann man zum Beispiel in die Datei wp-config.php einer WordPress Installation einfügen, damit ein SSL-Backend funktioniert.
2. Möglichkeit: .htaccess konfigurieren
Wenn man nicht im PHP-Code seiner Anwendung herumpfuschen will, dann kann man auch über die .htaccess Datei auf dem Backend-Server HTTPS vortäuschen.
Dazu genügt es folgende Zeile hinzuzufügen:
SetEnvIf X-Forwarded-Proto https HTTPS=on
gefunden auf: https://wiki.wiba10.de/doku.php/software:apache:reverse_proxy_ssl