Wie ich hier schon beschrieben habe, ersetzt Hugo bei URLs Umlaute nicht durch ihre Entsprechungen wie “ae”, “oe” usw, sondern behält sie bei. Ganz im Gegensatz zu WordPress.

Das bedeutet, dass z. B. die alte URL vom WordPress-Blog “/tags/mobilitaet/” in Hugo “/tags/mobilität/” heißt.

Ich hatte bereits am ersten Tag der Umstellung in ganz wenigen Fällen manuell Weiterleitungen erstellt, insgesamt nur drei.

Heute habe ich mich dann etwas damit beschäftigt, geprüft und festgestellt, dass es neben der Kategorie “Mobilität” noch 88 Tags mit Umlauten oder “ß” gibt.

Ich hatte nicht wirklich Lust, das alles manuell einzugeben, und so habe ich ein bisschen Shell-Magic benutzt, um das zu automatisieren. Das will ich hier genau beschreiben.

Überlegungen§

Nur am Anfang§

Diese ganzen Weiterleitungen muss man natürlich nur am Anfang nach dem Umzug von WordPress nach Hugo bereitstellen. Irgendwann werden Suchmaschinen von selbst auf die neuen URLs mit Umlauten umspringen. Aber ich verstehe nix von SEO. Mir gehts darum, dass ich mal gelernt habe, dass URLs möglichst immer bestehen bleiben sollten.

Alle URLs umschreiben, nicht nur Tags§

Es wäre auch möglich, zusätzlich noch alle URLs herauszufischen und die dann auch weiterzuleiten.

Nur je “Wort”, nicht allgemein möglich§

Weiterleitungen, die Umlaute für sich umschreiben, wären wohl keine gute Idee, weil die Teilstrings “ae”, “oe”, “ue” und “ss” auch so in URLs vorkommen könnten. Deshalb muss man die einzelnen Begriffe rausfischen und die Weiterleitungen basierend auf diesen erstellen.

.*ss.* -> .*ß.*
.*oe.* -> .*ö.*

keine gute Idee:

essen -> eßen
oboe -> obö

Umgekehrt wäre das kein Problem.

Wie es geht§

Datei 1 – Die aktuellen Tags aus Hugo auslesen§

Ich verwende meinen hier beschriebenen Alias hugo-search-tags:

hugo-search-tags -E "(ä|ö|ü|ß)" | cut -d':' -f2 > /tmp/umlaut-urls-hugo.txt

Zum Verständis: Die Funktion hugo-search-tags gibt mir die Daten in diesem Format aus (Anzahl:Tag):

327:mobilität
88:müll
83:müllsammeln
64:wälder
51:landstraße
51:fahrradanhänger
33:überholen
24:sonnenuntergänge
[…]

Datei 2 – Die selben Tags in den WordPress-Stil umwandeln§

hugo-search-tags -E "(ä|ö|ü|ß)" | cut -d':' -f2 | sed -e "s/ä/ae/g" -e "s/ö/oe/g" -e "s/ü/ue/g" -e "s/ß/ss/g" > /tmp/umlaut-urls-wordpress.txt

Beide Dateien vereinen§

Jetzt kann man mit dem Shell Tool paste jede Zeile der einen Datei mit der selben Zeile der anderen Datei vereinen und als Trenner einen Doppelpunkt verwenden:

paste -d':' umlaut-urls-wordpress.txt umlaut-urls-hugo.txt

Das Ergebnis ist dann:

mobilitaet:mobilität
muell:müll
muellsammeln:müllsammeln
waelder:wälder
landstrasse:landstraße
fahrradanhaenger:fahrradanhänger
ueberholen:überholen
sonnenuntergaenge:sonnenuntergänge
fruehling:frühling
bussgeldstelle:bußgeldstelle
[…]

Links ist der String, wie er in WordPress verwendet wurde und rechts der von Hugo.

Konfiguration für Nginx erzeugen§

Diese Ausgabe wird nun mittels sed so abgewandelt, dass man direkt die Ausgabe bekommt, die man in die Nginx-Konfiguration eintragen kann. Und das automatisch für alle Tags mit Umlauten.

Der gewünschte für “mobilität” ist zum Beispiel:

rewrite ^/tags/mobilitaet(.*)$ /tags/mobilit_t$1 redirect;

Update: Ich habe das Kommando angepasst, da die erste Version URLs von Blogbeiträgen zerstört hat, die den String eines Tags in der URL hatten, wie z. B. das Wort Frühling, für das es auch einen Tag gibt. Jetzt werden nur noch Tags erfasst.

Dies erreicht man mit diesem Kommando:

paste -d':' umlaut-urls-wordpress.txt umlaut-urls-hugo.txt | sed -E -e 's_(.*):(.*)_rewrite ^/tags/\1(.*)$ /tags/\2$1 redirect;_g'

Anmerkung zu den Unterstrichen bei sed: Man kann als Trenner in sed fast beliebige Trennzeichen verwenden, solange sie innerhalb eines Ausdrucks immer gleich sind. Meist sieht man hier einen Schrägstrich.

Die Ausgabe ist:

rewrite ^/tags/mobilitaet(.*)$ /tags/mobilität$1 redirect;
rewrite ^/tags/muell(.*)$ /tags/müll$1 redirect;
rewrite ^/tags/muellsammeln(.*)$ /tags/müllsammeln$1 redirect;
rewrite ^/tags/waelder(.*)$ /tags/wälder$1 redirect;
rewrite ^/tags/landstrasse(.*)$ /tags/landstraße$1 redirect;
rewrite ^/tags/fahrradanhaenger(.*)$ /tags/fahrradanhänger$1 redirect;
rewrite ^/tags/ueberholen(.*)$ /tags/überholen$1 redirect;
rewrite ^/tags/sonnenuntergaenge(.*)$ /tags/sonnenuntergänge$1 redirect;
rewrite ^/tags/fruehling(.*)$ /tags/frühling$1 redirect;
rewrite ^/tags/bussgeldstelle(.*)$ /tags/bußgeldstelle$1 redirect;
rewrite ^/tags/kaelte(.*)$ /tags/kälte$1 redirect;
rewrite ^/tags/mehrplatzfuersrad(.*)$ /tags/mehrplatzfürsrad$1 redirect;
[…]

Nginx neustarten§

Das kann man nun in Nginx eintragen und schon funktionieren alte Links wieder richtig :)

Vorher vielleicht noch testen mit:

nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Und Nginx neustarten.

Fertig. Alle Tags und Kategorien werden nun von den alten URLs auf die neuen von Hugo weitergeleitet.