====== Apache: SSL-Webanwendungen hinter Reverse Proxy ====== 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 Im Zusammenspiel mit der VHost Direktive auf dem Proxy sollte es nun keine Problem mehr geben