WordPress: Mixed Content Warnungen loswerden

Ich habe heute mal wieder ein paar Wartungsarbeiten an meinem Blog vorgenommen. Der Blog ist schon seit es Let’s Encrypt Zertifikate bei meinem Hoster (netcup) gibt, per HTTPS erreichbar, allerdings ehrlich gesagt ein bisschen lieblos gemacht. Jetzt ist es besser 🙂

Was war das Problem? Eine Website besteht nicht nur aus einem (HTML-)Dokument, sondern bettet eigentlich immer noch weitere Ressourcen ein, also Bilder, JavaScript, CSS etc. Die URL, unter der diese Ressourcen zu finden sind, steht in der ursprünglich ausgelieferten HTML-Datei. Es kann nun aber vorkommen, dass hier auf eine Ressource verwiesen wird, die nicht per HTTPS angesprochen wird. Und schon hat man eine unschöne Mixed-Content-Warnung am Hals 🙁

Die Idee dahinter ist richtig: Wenn ich eine sichere (=HTTPS) Seite besuche, diese dann aber z.B. ein JavaScript unsicher (=per HTTP) nachlädt, kann ein Angreifer dieses JavaScript weiterhin manipulieren, und damit immer noch eine Menge Unsinn anstellen. Alle Browser sind daher so eingestellt, dass aktiver Mixed-Content, also alles in Richtung Scripte, nicht erlaubt ist, und nicht geladen wird. Passiver Mixed-Content, also vor allem Bilder sind erlaubt, erzeugen aber eine Warnung.

Wo liegt nun also das Problem? Alle externen Ressourcen, die meine Seite einbindet (das sind im Wesentlichen Schriften von Google Fonts), wurden per HTTPS ausgeliefert, verursachen also kein Problem. Das Problem waren in Posts eingebettete Bilder. WordPress fügt Bilder im Editor immer mit einem absoluten Link ein, und dieser Link bezieht sich auf die aktuelle URL der Seite bei der Erstellung des Posts! Das sieht dann z.B. so aus:

<img class="aligncenter size-full wp-image-1434" title="posts" src="http://niklas-rother.de/wp-content/uploads/2011/08/posts.png" alt="" width="475" height="283">

Das Problem betrifft also alle Posts, die vor der Umstellung auf HTTPS erstellt wurden. Leider lässt es sich auch nicht so einfach lösen, denn dafür müsste man alle alten Posts bearbeiten, und dort die Links anpassen. Alternativ hätte man sich vorher mal beschweren sollen, dass WordPress vielleicht lieber relative URLs für die Bilder hätte verwenden sollen 😉

Ich hatte das Problem damals recht einfach mit der Holzhammer Methode gelöst: Das Plugin „SSL Insecure Content Fixer“ tut, was der Name verspricht: Es löst auf magische Art und Weise alle Mixed-Content-Probleme 😛 Was das Plugin tatsächlich macht, ist recht einfach: Es fängt die Ausgabe der Posts ab, und repariert alle Links per Suchen&Ersetzen bevor sie an den Browser geschickt werden. Ein einfache und effektive Lösung, aber nicht besonders elegant, und auch nicht gerade förderlich für die Performance, das die Ersetzung jedes mal auf neue durchgeführt wird.

Ich habe das Problem daher heute endgültig gelöst, und die Links direkt in der Datenbank repariert. Dafür gibt es auch wieder ein Plugin: Better Search Replace. Dieses Plugin führt einfach eine Textersetzung in der Datenbank aus. Vorher ein Backup machen!

Ich habe diese Einstellungen verwendet:

Einstellungen von Better Serach Replace

Es wird also die alte HTTP-URL durch die neue HTTPS-Variante ersetzt, und das in allen Tabellen außer den Kommentaren (die Tabelle ist sehr groß, und da sollte nicht drin sein). Das Wesentlich ist die Tabelle „wp_posts“, dort ist der HTML-Code der eigentlichen Beiträge drin gespeichert. Das Ergebnis sah dann so aus:

Ergebnis der Ersetzung

Wie zu erwarten war, wurde vor allem in wp_posts erwas setzt. In wp_postmeta (Metadaten zu den Posts) und wp_options (Einstellungen des Blogs) waren vor allem irgendwelche Caches von alten Plugins, die aber vermutlich auch kein Problem gemacht hätten.

Damit sind die Mixed-Content-Warnungen jetzt Gechichte, und der SSL-Check (sehr nützlich!) gibt grünes Licht. Außerdem habe ich gleich noch mal PHP auf 7.2 (warum nicht 7.4, nectup?) aktualisiert, WordPress geupdated und 32k Spam-Kommentare gelöscht. Außerdem wird die Website jetzt von nginx statt Apache ausgeliefert. Damit ist der Blog wieder frisch für 2020. Jetzt brauch ich nur noch Inhalte…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert