Nachdem mein Server-Setup letztens nach dem Umzug auf neue Hardware ja etwas umgebaut wurde, hatte ich mit meinem Blog ein wenig zu Kämpfen, da das Blog aus Performance-Gründen nur interne IPs mit HTTP-Requests sieht (die externen IPs sind via Header auch sichtbar). Entsprechend war das Blog auch bei Abruf über SSL ständig der Meinung die Resourcen mit HTTP, also ohne Verschlüsslung abzurufen.
Ursache für dieses Phänomen ist, dass die Funktion is_ssl() von WordPress nicht mit Reverse-Proxy-Konfigurationen kann, und daher das Request-Schema der internen Verbindung für die Entscheidung heranzieht. Dies lässt sich aber leicht ändern.
Mit zwei kleinen Änderungen kann man WordPress vorgaukeln, dass die interne Verbindung HTTPS nutzt. Hierzu fügt man in seiner wp-config.php folgende Zeilen vor dem Include der wp-settings.php ein:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS']='on';
}
Nun muss man im Reverse-Proxy nur noch für eine korrekte Weitergabe der Information zum Protokoll der ursprünglichen Verbindung sorgen. In meinem Fall mit nginx ist das exakt eine Zeile:
proxy_set_header X-Forwarded-Proto $scheme;
Und siehe da: Nun klappt das auch mit dem WordPress und SSL.