- Update 06.08.2013: Problem bei internen Verlinkungen
- Update 27.12.2013: Problem: Falsche RewriteBase in .htaccess nach WP-Update
- Update 08.01.2014: Hinweis: Vorgehen funktioniert nur bei Installation in /
- Update 29.01.2015: Hinweis: SSL/TLS ohne PRoxy bei All-Inkl möglich
WordPress kann so konfiguriert werden, dass die Administration über SSL erzwungen wird. Die Standardoptionen “FORCE_SSL_LOGIN” und “FORCE_SSL_ADMIN” benötigen dazu aber ein eigenes SSL-Zertifikat, so dass das Blog direkt unter https erreichbar ist(siehe codex.wordpress.org). Bei vielen Providern muss dafür allerdings ein Aufpreis gezahlt werden. Alternativ stellen sie jedoch meistens einen Zugriff per SSL-Proxy zur Verfügung Dabei wird auf das Blog üblicherweise über eine andere Adresse (z.B. https://klein-gedruckt.de) zugegriffen. Will man die kostengünstigere SSL-Proxy-Variante verwendet werden, so ist eine einfache Aktivierung der SSL-Verschlüsselung leider nicht möglich.
Mit folgenden Änderungen kann ich jedoch bei mir die SSL-Verschlüsselung via Proxy bei meinem Provider all-inkl erzwingen.
Zugriff auf /wp-admin per SSL-Proxy ermöglichen
Zunächst muss die WordPress-Konfiguration in der Datei wp-config.php angepasst werden. Da beim Zugriff über den SSL-Proxy das Blog unter einer anderen URL angesprochen wird, mache ich hier einen Unterschied, ob ein direkter unverschlüsselter Zugriff, oder eine Zugriff über den SSL-Proxy erfolgt. Daher habe ich folgende Änderungen an den Anfang der wp-config.php eingefügt:
/* Zugriff über SSL-Proxy ermöglichen */ if( isset( $_SERVER['HTTP_X_FORWARDED_SERVER'] ) ) { # Zugriff mit SSL-Proxy $_SERVER['HTTPS']='on'; $_SERVER['HTTP_HOST'] = 'ssl-account.com'; $_SERVER['REQUEST_URI']='/klein-gedruckt.de'. $_SERVER['REQUEST_URI']; define('COOKIE_DOMAIN', 'ssl-account.com'); define('COOKIEPATH', '/klein-gedruckt.de/'); define('WP_SITEURL', 'https://klein-gedruckt.de'); define('WP_HOME', 'https://klein-gedruckt.de'); } else { # Zugriff ohne SSL-Proxy define('COOKIE_DOMAIN', 'klein-gedruckt.de'); define('WP_SITEURL', 'https://klein-gedruckt.de'); define('WP_HOME', 'https://klein-gedruckt.de'); }
Hier müssen natürlich überall da wo klein-gedruckt.de auftaucht die tatsächliche URL des jeweiligen Blogs eingetragen werden. Nach diesen Änderungen sollte das Blog sowohl unverschlüsselt als auch per SSL-Proxy verschlüsselt korrekt aufgerufen und administriert werden können.
Erzwingen der Administration per SSL-Proxy
Damit nun nicht versehentlich die unverschlüsselte Variante genutzt wird, sollte die Verschlüsselung bei der Administration bzw. beim Login entsprechend erzwungen werden. Dazu wird folgende Rewrite-Rule in der .htaccess vor der Zeile “# BEGIN WordPress” hinzugefügt:
<IfModule mod_rewrite.c> RewriteEngine on RewriteBase / # wp-(admin|login|register)* auf HTTPS umleiten RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-FORWARDED-SERVER} !^ssl-account\.com$ [NC] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^wp-(admin|login|register)(.*) https://klein-gedruckt.de/wp-$1$2 [L] # xmlrpc* auf HTTPS umleiten RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-FORWARDED-SERVER} !^ssl-account\.com$ [NC] RewriteRule ^xmlrpc(.*) https://klein-gedruckt.de/xmlrpc$1 [R=301,L] </IfModule>
Update 06.08.2013: Nach einem Kommentar von Tino habe ich nochmal ein Kapitel zum Thema interne Verlinkungen spendiert
Problem: Interne Verlinkungen
Werden die Änderungen wie oben beschrieben durchgeführt und die Administration per SSL-Proxy erzwungen, so wird man relativ schnell feststellen, dass die internen Links alle über den SSL-Proxy referenziert werden, wenn beispielsweise ein anderer Artikel im Blog verlinkt wird (siehe auch den Kommentar von Tino. Auf der anderen Seite sind die Verlinkungen in bereits geschriebenen Artikeln bisher immer ohne SSL-Proxy eingefügt worden.
Dies führt dazu, dass der User nicht mehr immer im gleiche Kontext bleibt, sondern er zwischendurch per SSL-Proxy auf das Blog zugreift, obwohl er eigentlich unverschlüsselt darauf zugreifen will oder umgekehrt. Der Wechsel zwischen unverschlüsselten und verschlüsselten Bereichen ist unschön, zumal sich bei der Verwendung eines SSL-Proxies auch immer die Domäne ändert.
Es gibt drei Lösungsansätze wie man dies umgehen kann:
- Interne Links werden immer manuell eingefügt oder so angepasst, dass sie immer auf die URL ohne SSL-Proxy verweisen. So ist zumindest gewährleistet, dass die Nutzer, die ohne SSL-Proxy auf dem Blog surfen nicht an den SSL-Proxy weitergeleitet werden. Die SSL-User werden bei dieser Lösung allerdings ggf. auf unverschlüssetlte Seiten umgeleitet.
- Ein ähnliches Ergebnis hat Tino erreicht, indem er die oben beschriebene Konfiguration etwas abgeändert hat (siehe Kommentar unten). Dabei setzt er in der wp-config.phph die Konstante WP_HOME auch beim Zugriff über den SSL-Proxy auf die unverschlüsselte URL des Blogs (z.B. mit dem Kommando define(‘WP_HOME’,’https://klein-gedruckt.de’);). Ich habe diese Lösung nicht selber ausprobiert, aber sie dürfte zum gleichen Ergebnis führen wie in Punkt 1 beschrieben. Ich bin mir allerdings nicht sicher, ob das Ändern der Konstanten WP_HOME nicht noch weitere unerwünschte Nebenwirkungen mit sich bring (z.B. das unverschlüsselte Nachladen von Inhalten bei der Administration).
- Da ich meinen Usern sowohl den unverschlüsselten als auch den verschlüsselten Zugriff durchgängig ermöglichen möchte, habe ich ein Plugin-geschrieben, dass abhängig vom Aufruf des USers die Links in den Artikeln und Seiten dynamisch angepasst werden. Dabei werden alle Links auf den SSL-Proxy umgebogen, wenn der User per SSL-Proxy surft. Greift er unverschlüsselt auf das Blog zu, werden alle Links entsprechend angepasst, so dass der Zugriff ohne Proxy erfolgt. Details zum Plugin “SSL-Proxy URL Fixer” findet ihr in einem eigenen Artikel.
Update 27.12.2013: Nachdem meine Blog-Artikel nach dem letzten WordPress-Update nicht mehr erreichbar waren, bitte folgenden Hinweis beachten:
Problem: Falsche RewriteBase in .htaccess nach WP-Update
Wird das Admin-Interface über den SSL-Proxy aufgerufen, so wird es bei meinem Provider all-inkl.com über den ssl-account.com im Pfad <domainname.com> aufgerufen. Dies kann dazu führen, dass bei einem Update die RewriteBase in der .htaccess des WP-Basis-Verzeichnis entsprechend verändert wird. Dies wührt dazu, dass die Artikel beim Aufruf ohne SSL-Proxy nicht mehr erreichbar sind und es zu einem internen Server Error kommt. Durch eine einfache Anpassung sind die Artikel aber wieder schnell erreichbar:
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /your-domain.de/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /your-domain.de/index.php [L] </IfModule> # END WordPress
Hallo Stephan,
Du hast mir den Tag gerettet! … und viele folgende Tage auch.
Ich habe schon Ewigkeiten rumprobiert und irgendwie habe ich es nie hin bekommen, mein WordPress-Blog über den SSL-Proxy von Allinkl zu “besteigen”. Und wenn es mal geklappt hat, dann waren die hochgeladenen Bilder nur unter der SSL-Proxy URL zu erreichen.
Und seit heute klappt es, so ein Zufall ;-)
Also, vielen Dank für diesen Eintrag!
Schöne Grüße und schönes Wochenende
Tino
Hallo Tino,
danke für die Rückmeldung. Freut mich zu hören, dass es bei dir auch funktioniert hat.
Gruß
Stephan
Hallo Stephan,
ich nochmal. Kleine Ergänzung noch von mir.
Mit der WordPress Standardkonfig dürfte man das Problem haben, dass bei den internen Verlinkungen (z.B. auf andere Beiträge) die SSL-Proxy URL des Blogs eingefügt wird statt der eigentlichen WordPress Home URL.
Um diesen Schönheitsfehler auszubügeln kann man in der wp-config.php den Eintrag
define(‘WP_HOME’,’http://klein-gedruckt.de’);
setzen (um an Dein Beispiel oben anzuknüpfen).
Viele Grüße
Tino
Hallo Tino,
danke für die Ergänzung. Das war mir so noch nicht aufgefallen, weil ich die Links auf andere Artikel meist manuell einfüge. Ohne das ich ihn ausprobiert hätte, denke ich, dass dein Lösungsvorschlag gut funktioniert, wenn zwar die Administration per SSL durchgeführt wird, das Blog selbst jedoch nur ohne SSL.
Da mein Blog allerdings auch per SSL-Proxy verfügbar sein soll, würde ich gerne im jeweiligen Kontext bleiben. Also wenn jemand das Blog ohne SSL aufruft, sollen auch alle internen Links ohne SSL sein. Wird das Blog per SSL-Proxy angesurft, sollen auch alle internen Links per SSL verlinkt sein.
Dazu habe ich mir ein Plugin geschrieben, dass die URLs in den Beiträgen entsprechen der Aufruf-URL anpasst. Den von Dir beschriebenen Fall hatte ich bisher vergessen und im Plugin bislang nicht berücksichtigt. Dank deines Tipps habe ich das Plugin entsprechend angepasst…
Ich werde bei Gelegenheit den Artikel anpassen und ggf. auch den Quelltext des Plugin einfügen.
Vielen Dank für Deinen Tipp!
Gruß
Stephan
Hi Stephan,
das ist natürlich der eleganteste Weg.
Ich bin gespannt auf das Plugin, habe mir einen Link gesetzt und schaue die Tage mal wieder vorbei.
Viele Grüße
Tino
Erstmal Danke für den informativen Blogpost.
Bei mir tritt jedoch folgendes Problem auf:
Der Redirect auf ssl-account.com funktioniert, ich kann auch im Backend alles Einstellen usw..
Möchte ich allerdings Beiträge aus dem Backend heraus anschauen bekomme ich einen Server Fehler 500 sofern der Beitrag schon veröffentlicht wurde und falls nicht, bekomme ich nur zu sehen: Beitrag nicht gefunden!?
Habe schon so ziemlich alles probiert was mir eingefallen ist, aber nichts hilft. Habt Ihr da Ideen?
Ach ja, den Tipp mit dem define (‘WP_HOME’,’http://klein-gedruckt.de’); habe ich auch schon getestet, ebenfalls ohne Besserung.