Dieses Tutorial ist VALID.

Bitte lies Dir den Disclaimer durch, bevor Du eine Anleitung umsetzt...

Haftungsausschluss / Disclaimer

Traefik Weiterleitung mit der Regex / Redirect Middleware

Um Gottes Himmels Willen…
Wem das mit den Regular Expressions eingefallen ist, der hat seinen eigenen Bannkreis in der Hölle verdient.

Hilft aber nicht, wir müssen da durch, falls wir unter Traefik zwei oder mehr Domains auf ein gemeinsames Ziel verschalten wollen.

Dies ist ein Exkurs zu Regex aus dem Artikel, wie wir mehrere WordPress Instanzen parallel auf einer Maschine anfahren können. Dann mal los, bevor ich’s mir anders überlege…

Redirect und Let’s Encrypt

Gleich vorab: Obwohl es immer wieder in manchen Posts anders behauptet wird, funktioniert das Anfordern und Einrichten der Zertifikate für die Domains über Let’s Encrypt auch im Zusammenspiel mit den Redirects einwandfrei!

Die Redirect Middleware von Traefik v2

Als Beispiel nehme ich hier an, dass ich „www.xp-server.de“, „xp-server.de“, „www.xpserver.de“ und „xpserver.de“ auf die URL „wordpress.xp-server.de“ umschreiben möchte.

Fangen wir damit an…

Das hat sich erst mal ganz einfach angesehen und klingt in sich logisch:
Ich hab einen eingehenden Link.
In dem suche ich nach Mustern.
Wenn ich die finde, ersetze ich „Link A“ durch „Link B“.

Wir brauchen dafür auch nur drei Zeilen Code in der docker-compose.yml.
Ich präsentiere… Die Redirect-Regex-Middleware:

- "traefik.http.middlewares.xp-server-redirect.redirectregex.regex=^https:\/\/(www.)?(xp-server.de|xpserver.de)(.+)?"
- "traefik.http.middlewares.xp-server-redirect.redirectregex.replacement=https://wordpress.xp-server.de$${3}"
- "traefik.http.middlewares.xp-server-redirect.redirectregex.permanent=true"

Und was macht diese Höllenmaschine?

  • Zeile 1: Ich lege fest, nach was ich suche (regex=…)
  • Zeile 2: Ich lege fest, durch was ich das ersetze (replacement=…)
  • Zeile 3: Die Weiterleitung soll „permanent“ erfolgen, also ein „301-Redirect“

Bitte beachten: Die Middleware muss für jeden Redirect einen eindeutigen Namen bekommen. Wir können nicht einfach alle Redirects „hostredirect“ nennen, wie ich das erst gemacht habe. Spätestens bei der zweiten docker-compose-Datei, die wir starten, fliegt uns Traefik sonst mit der Fehlermeldung „Middleware defined multiple times with different configurations“ um die Ohren. Sehr ärgerlich!

Was auch ärgerlich ist, dass wir die ganze „Suche“ in eine einzige Zeile packen müssen. Sonst wäre es ja einfach, wenn wir mehrere Zeilen aufmachen könnten, um dort die Domains jede für sich reinzuschreiben…

Und leider, leider ist die Auswahl – unser Suchen und Ersetzen – in „Regex“.

Darum folgt an dieser Stelle etwas, das ich an sich hasse und nur in seltenen Ausnahmefällen mache:
Ich verwende etwas in der Config, das ich nicht verstehe…

Regex – die Regular Expressions

Ich hab das nicht geblickt. Nein, Regex geht nicht rein in mein Hirn. Nach mehreren Tagen Trial & Error, dem Ausprobieren und Durchspielen von ungefähr 30 Varianten aus verschiedenen Forenposts, bin ich dann bei dieser Schreibweise geblieben. Aber ich habe keine Ahnung, ob das eine gute Variante ist. Ein „Catch All“ hat sich auch recht sexy angesehen. Ich weiß auch nicht, ob die Angabe des Ziels so in Ordnung ist. Aber da es *nirgends* in den Posts vernünftig erklärt wird und die Methode funktioniert… *Sigh*!

Also bitte: Wenn sich jemand mit der Materie auskennt und mir an der Stelle helfen mag: Feuer frei :)

Wer selber mal mit Regular Expressions spielen will: Als Hilfestellung habe ich die Internetseite regex101.com benutzt, auf der man verschiedene Regex-Funktionen testen und auswerten kann.

Zeile 1: Die Auswahl

Unterteilen wir diesen regulären Ausdruck in seine Bestandteile. So viel hab ich noch kapiert:

.regex= ^ https:\/\/ (www.)? (xp-server.de|xpserver.de) (.+)?
  • ^ – damit beginnt die Regex-Instruktion
  • https:\/\/ – es folgt „https“ (weil Traefik schon von „http“ umgeleitet hat, haben wir hier ausschließlich https). Dann Doppelpunkt und Doppelslash. Da der Schrägstrich aber wohl in sich bei Regex eine Funktion darstellt, muss man den mit dem vorangestellen „Rückwärtsschrägstrich“ brechen: Statt „//“ schreiben wir also „\/\/“. Der Interpreter macht dann wieder „//“ daraus.
  • (www.)? – In Klammern stehen Gruppen. Dies ist dann „Gruppe 1“. Entweder „www.“ oder eben „nicht www.“.
  • (xp-server.de|xpserver.de) – „Gruppe 2“ enthält alle unsere Domainnamen, die wir umleiten wollen, in „oder“ Form getrennt durch den senkrechten Strich. Hier können wir so viele Domains eintragen, wie wir wollen. Auch verschiedene Länderkürzel sind erlaubt (domain1.de|domain2.com|domain3.net). Hier bitte kein „www“ eintragen, weil wir das schon im letzten Schritt adressiert haben (Gruppe 1). In Gruppe 2 haben wir nur die blanken Domainnamen.
  • (.+)? – „Gruppe 3“ ist der „Rest“ des Links hinter der Domain. Also zum Beispiel „/wp-admin“ oder „/das-ist-ein-tutorial“ bis zu „/?p=2867“, falls wir keine „schönen“ Permalinks eingestellt haben. „Gruppe 3“ müssen wir uns merken, weil wir die nach dem Umschreiben des Links natürlich wieder hinten ans Ziel dranpappen müssen. Sonst würden alle Weiterleitungen immer direkt auf der Startseite enden…

Traefik zerlegt quasi die auf ihn geworfenen Anfragen in diese Scheibchen und sucht nach übereinstimmenden Mustern. Bei einem Treffer gibt er den Link an „Zeile 2“ weiter, die ihn dann umschreibt. „Kein Treffer“ führt den Link unverändert aus.

Zeile 2: Das Umschreiben der Adresse

Hier geben wir nun die gewünschte Haupt-Adresse an, komplett mit „https://“ und eventuellem „www.“:
[…replacement=https://wordpress.xp-server.de$${3}]

$${3}“ fügt „Gruppe 3“ – also den „Rest“ des Links – an unsere Auswahl an.

Damit ist das Umschreiben beendet und der neue Link wird von Traefik an den WordPress Container weitergereicht, der sich dann darum kümmert.

Was wird umgeschrieben

Im folgenden nun alle möglichen eingehenden Domains (Zeile 1-4) und zu was die dann umgeschrieben werden (Zeile 6):

https://www.xp-server.de/dasisteintest
https://www.xpserver.de/dasisteintest
https://xp-server.de/dasisteintest
https://xpserver.de/dasisteintest

https://wordpress.xp-server.de/dasisteintest

Alternativen

Die „Catch All“ Regel sollte dann so aussehen:

- "traefik.http.middlewares.xp-server-redirect.redirectregex.regex=^https:\/\/(.*)/(.*)"
- "traefik.http.middlewares.xp-server-redirect.redirectregex.replacement=https://wordpress.xp-server.de/$${2}"
- "traefik.http.middlewares.xp-server-redirect.redirectregex.permanent=true"

Hier haben wir „https://(Gruppe 1)/(Gruppe 2)“.
(Gruppe 1) sind alle möglichen Domains mit und ohne „www“. (Gruppe 2) ist der „Rest“ vom Link hinter dem Schrägstrich.

Ob das besser oder schlechter als die zielgerichtete Auswahl der Domains ist? Echt, keine Ahnung. Dazu hab ich absolut nichts in den Foren und Postings gefunden…

Universeller wäre das halt auf jeden Fall, weil man es nicht auf seine eigenen Domains anpassen braucht und wegen dem „Catch All“ immer passt. Aber es würde auch permanent jedes Mal alles umschreiben. Und ich weiß nicht, wie sich das auf die Performance auswirkt.

Fischen im Trüben… :/

Anzeige *

Kommentar verfassen

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

Verwendung
von Cookies

Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung.

Scroll to Top