WordPress war ursprünglich dafür gedacht ein digitales Tagebuch, einen Blog, zu führen. Doch davon sind die meisten mit WordPress betreibenen Seiten weit entfernt. An diversen Stellen in WordPress begegnet man diesem ursprünglichen Gedanken. Besonders in den Standardeinstellunen für Permalinks. Hier wird als Standardeinstellung die URL-Struktur für einen Beitrag aus dem Datum mit Jahr, Monat, Tag und dem Beitragstitel z.B. /2020/02/20/beispielbeitrag/
generiert. Perfekt für ein Tagebuch aber schlecht für eine Website wo man regelmäßig Änderungen an seinem Inhalt vornimmt um diesen aktuell zu halten.
Das Problem
Ändert man in WordPress das Beitragsdatum, ändert sich auch die URL-Struktur. Der Beitrag ist dann unter dem neuen Jahr/Monat/Tag erreichtbar aber nicht mehr unter dem alten Datum. Stattdessen informiert WordPress unter der alten URL, dass kein Beitrag gefunden werden konnte und gibt pflichtbewusst den 404 Not Found Status zurück.
Beispiel:
Beispielbeitrag veröffentlicht am 19. November 2018:
https://go-around.de/2018/11/19/beispielbeitrag/ → 200 Found
Beispielbeitrag aktualisiert am 20. Februar 2020:
https://go-around.de/2018/11/19/beispielbeitrag/ → 404 Not Found https://go-around.de/2020/02/20/beispielbeitrag/ → 200 Found
Damit hat man zwei Probleme:
- Suchmaschinen z.B. Google findet den Beitrag nicht mehr und schmeißen ihn aus dem Index. Der Beitrag unter der neuen URL interpretieren die Suchmaschinen als neuen Beitrag und es muss erst neues Vertrauen aufgebaut werden d.h. die Rankings gehen sehr wahrscheinlich verloren.
- Für die ursprüngliche URL gesammelte Backlinks von anderen Seiten führen auf die 404-Seite und sind damit wertlos. Im schlimmsten Fall wird der Link sogar vom Seitenbetreiber entfernt, weil der Inhalt scheinbar gelöscht worden ist.
Zusammengefasst: Für die Suchmaschinenoptimierung ein ganz großer Stolperstein!
An der Stelle könnte man WordPress eigentlich zutrauen statt einer 404-Seite anhand des Slugs beispielbeitrag
nach dem Beitrag zu suchen und den Leser zu der korrekten URL weiterzuleiten: Tut WordPress aber leider nicht!
Das heißt jedes Mal wenn man das Beitragsdatum anpasst, muss man per Hand einen Redirect erstellen z.B. mit einem Plugin wie Redirection. Alternativ könnte man komplett darauf verzichten das Veröffentlichungsdatum jemals zu ändern. Meiner Meinung nach aber keine gute Idee. Durch ein Update signalisiert man den Suchmaschinen, dass man den Beitrag aktuell hält. Außerdem wird das Veröffentlichungsdatum häufig auch in den Suchergebnissen angezeigt.
Permalinks umstellen
Wer WordPress intensiv für seine Website nutzt und nicht gerade ein Tagebuch umsetzen will, kommt früher oder später an den Punkt wo er die Standardeinstellungen für Permalinks von WordPress ändern will und in der URL nur den Beitragsnamen haben möchte. Die Änderung kann man innerhalb von wenigen Sekunden in Einstellungen › Permalinks erledigen. Schon sind alle Beiträge, auch alle alten, unter https://go-around.de/beitragsname/
erreichbar.
Die Änderung hat aber wiederum zur Folge, dass alle alten URL mit Jahr, Monat, Tag einen 404-Fehler ausgeben. Auch an dieser Stelle könnte WordPress eingreifen und einen Redirect durchführen, tut es aber nicht.
Redirects setzten
Also müssen wir selber ran. Allerdings macht es wirklich kein Spaß im schlimmsten Fall für mehrere Hundert Beiträge manuell Weiterleitungen zu erstellen. Helfen kann uns dabei aber zum Glück ein bisschen Magie Reguläre Ausdrücke, kurz Regex.
Mit diesem regulären Ausdruck kann man die alte URL-Struktur identifizieren und anschließend weiterleiten:
^\/\d{4}\/\d{2}\/\d{2}\/(.*)$
Der Reguläre Ausdruck wird nur auf den Pfad z.B. /2019/02/20/beispielbeitrag/
und nicht auf die ganze URL inkl. Protokoll z.B. https
und Domain z.B. go-around.de
Das sehr zwar auf dem ersten Blick wirklich nach Magie aus aber wenn man es sich Stück für Stück anschaut ist es eigentlich gut verständlich:
^
markiert den Start der Zeile\/
ist ein normaler Slash/
escapes mit einem\
davor, damit es nicht als Anweisung interpretiert werden kann.\d{4}
sind genau vier{4}
Zahlen\d
für das Jahr\/
ist ein normaler Slashd{2}
sind genau zwei{2}
Zahlen\d
für den Monat\/
ist ein normaler Slashd{2}
sind genau zwei{2}
Zahlen\d
für den Tag\/
ist ein normaler Slash(.*)
ist die Gruppe()
die wir in dem Text suchen z.B. beispielbeitrag und kann aus beliebig vielen*
Zeichen.
bestehen.$
markiert den Ende der Zeile
Mit seiner URL-Strucktur testen und damit herumspielen kann man auf Regexr.com.
Anschließend benutzen wir die gefunden (erste) Gruppe $1
um den Besucher zu der neuen URL weiterzuleiten:
/$1/
Tipp: Für weitere Permalink-Strukturen z.B. /beispielkategorie/beispielbeitrag/
bietet Yoast einen Tool an den korrekten Redirect zu erzeugen. (Danke geht an Torsten)
Habt ihr eurem Pfad z.B. ein /blog/
vorangestellt, müsst ihr auch dieses berücksichtigen. Der korrekte reguläre Ausdruck sieht dann so aus:
^\/blog\/\d{4}\/\d{2}\/\d{2}\/(.*)$
Code-Sprache: Nginx (nginx)
Und das ist euer neuer Pfad:
/blog/$1/
Code-Sprache: Nginx (nginx)
Konfiguration
Die Umleitung mit dem regulären Ausdruck können wir an zwei Stellen anwenden (man sollte sich aber für eine Entscheiden):
- Webserver: Ihr könnt die Umleitung direkt in der Konfiguration eures Webservers z.B. Apache oder NGINX platzieren. Die Umleitung ist dadurch sehr schnell aber ihr dürft die Konfiguration nicht z.B. bei einem Hosterumzug vergessen zu übernehmen
- WordPress Plugin: Es gibt eine Reihe von WordPress Plugins die eine Umleitung mit Regex erlauben z.B. das kostenfreie Redirection oder der Redirect Manager als Bestandteil von Yoast SEO Premium. Diese Variante ist nicht so performant, geht aber außer bei einem Pluginwechsel nicht verloren.
Hier die notwendigen Konfigurationen:
Plugin: Redirection
Beim kostenfreien Plugin Redirection müsst ihr unter Werkzeuge → Redirection → Eine neue Weiterleitung hinzufügen folgende Einstellungen machen:
- URL-Quelle:
^\/\d{4}\/\d{2}\/\d{2}\/(.*)$
- Optionen: Regex anhaken wichtig!
- Ziel-URL:
/$1/
Testet anschließend die Weiterleitungen mit mehreren alten Beiträgen!
Plugin: Yoast SEO Premium
Unter SEO → Weiterleitungen → Regex-Weiterleitungen müsst ihr folgendes Eingeben:
- Art: 301 Dauerhaft umgezogen
- Regulärer Ausdruck:
^\/\d{4}\/\d{2}\/\d{2}\/(.*)$
- URL:
/$1/
Anschließend solltet ihr die Einstellungen mit mehreren alten URLs testen.
Webserver: NGINX
Beim Webserver NGINX müsst ihr folgendes Snipped vor dem ersten location / {}
Block einfügen:
# Redirect Year/Month/Day Permalink Structure to Postname
location ~ "^\/\d{4}\/\d{2}\/\d{2}\/(.*)$" {
rewrite "^\/\d{4}\/\d{2}\/\d{2}\/(.*)$" /$1 permanent;
}
Code-Sprache: Nginx (nginx)
Testet anschließend die neue Konfiguration mit nginx -t
und startet NGINX mit service nginx restart
neu.
Webserver: Apache
Bei Apache müsst ihr in eurer .htaccess
vor der Konfiguration für WordPress folgendes Snipped einfügen:
# Redirect /Year/Month/Day Permalink Structure to Postname
RedirectMatch permanent "^\/\d{4}\/\d{2}\/\d{2}\/(.*)$" /$1/
Code-Sprache: Apache (apache)
Anschließend speichern und die Weiterleitung ausgiebig testen!
Fazit
Ich sehe leider immer wieder, dass WordPress-Seitenbereiber über diese, meiner Meinung nach nicht mehr zeitgemäße, Standardeinstellung stolpern und bei einer Änderung alle Backlinks in der Tonne landen. Mit der richtigen Weiterleitung verliert ihr keine Backlinks und müsst die Umstellung nicht fürchten.
Yoast hat dafür einen praktischen Helper, der auch andere Ursprungs-Permalinkstrukturen abdeckt:
https://yoast.com/research/permalink-helper.php
Ganz praktisch, um den Code schnell zu erstellen.
War mir bisher nicht bekannt, sehr guter Tipp! Habe ich direkt im Beitrag ergänzt.
Ich nutze seit dem Anfang meines Blogs die Struktur Domain/Kategorie/Beitrag. Damit bin ich bisher gut gefahren. Ich hielt die Datumsangaben in der URL immer für falsch. Dennoch ist das ein wissenswerter Artikel. Danke dafür.
Meine Permalinks habe ich auf Domain/Beitrag gestellt, weil ich mir am Anfang mit meinen Kategorien nicht so sicher war.
Zum Glück, denn ich habe später nochmal umdisponiert.
Ein weiteres SEO Plugin das Redirects unterstützt ist https://rankmath.com/kb/setting-up-redirections/
Dieser Artikel wurde erwähnt auf gist.github.com
Genau diesen Fehler habe ich gemacht und möchte ihn jetzt gerne ändern. Danke für deinen Beitrag.