Umleitung auf eine externe Domain mit traefik
Willkommen zu einem weiteren Blog-Beitrag! Diesmal werden wir uns ansehen, wie man mit traefik auf eine externe URL umleitet, ohne einen Container zu verwenden. Docker ist völlig optional, aber ich betreibe mein traefik mit Docker, also werde ich mich auch darauf beziehen. Dies sollte auch mit anderen funktionieren, aber ich habe es nicht getestet.
Einrichten des File Providers
Um unsere Weiterleitungen in Traefik einzubinden, werden wir den File Provider verwenden. Hierfür müssen wir zwei Dinge tun
Ein Verzeichnis für den File Provider erstellen
Erstelle ein neues Verzeichnis provider
neben deinem compose file und mounte es in deinen Container.
Aktivieren des File Providers in der Konfiguration
Jetzt müssen wir unsere traefik.yaml
ändern und einen File Provider hinzufügen.
Dadurch kann Traefik jede Datei in unserem Provider-Verzeichnis überwachen. So können wir mehrere Dateien verwenden, um unsere Provider zu gruppieren und sie besser zu organisieren. Traefik überwacht auch Änderungen an unseren Providern. Sobald wir also eine Datei bearbeiten, erstellen oder löschen, wirken sich diese Änderungen sofort auf das Routing von Traefik aus.
Warnung
Traefik überwacht nur Dateien im Hauptverzeichnis, du kannst also keine Unterverzeichnisse verwenden.
Warnung
Vergiss nicht, deinen Traefik-Container neu zu starten.
Einen Redirect erstellen
Um einen Redirect zu erstellen, brauchen wir zwei Dinge: eine redirectRegex
middleware und einen router, der die Anfragen annimmt.
Dazu erstellen wir eine Datei redirect.yml
(der Name ist beliebig) in unserem neuen provider
Verzeichnis.
Hinweis
Du kannst auch eine Datei für jeden Redirect erstellen.
Ein Shell-Skript dafür findest du unten
Einrichten der redirectRegex Middleware
http:
middlewares: # (1)!
chojo-dev-redirect: # (2)!
redirectRegex: # (3)!
regex: "(.*)" # (4)!
replacement: "https://chojo.dev/" # (5)!
permanent: false # (6)!
- Wir erstellen Middlewares, also benutzen wir den Middleware-Abschnitt.
- Definiere eine neue Middleware mit dem Namen
chojo-dev-redirect
. - Definiere den Typ der Middleware als
redirectRegex
. - Definiere das Regex-Muster als
(.*)
, das im Grunde auf alles passt. Dies ist der Teil der URL, den wir ersetzen wollen. Wir wollen also wirklich die gesamte Zeichenkette ersetzen. - Definiere die neue URL, zu der wir umleiten wollen.
- Markiere die Weiterleitung als temporär. Dadurch wird verhindert, dass der Browser zwischenspeichert, und die Änderungen an unserer Weiterleitung werden sofort wirksam.
Wenn du wissen willst, was die einzelnen Zeilen bewirken, sieh dir die Kommentare an.
Einrichten des Routers
Jeder Router braucht einen Dienst, mit dem er verbunden ist.
Natürlich könnten wir Docker verwenden, um für jede unserer Weiterleitungen einen Dienst zu starten, oder wir könnten einen einzigen Dienst starten und ihn wiederverwenden.
Zum Glück hat traefik bereits vorgesorgt und bietet einen Dienst für genau diesen Anwendungsfall namens noop@internal
.
Hinweis
Der Abschnitt Middlewares
ist immer noch da, ich zeige ihn nur nicht.
http:
routers: # (1)!
chojo-dev-redirect: # (2)!
service: noop@internal # (3)!
entrypoints: "https" # (4)!
rule: "Host(`my.host.com`)" # (5)!
middlewares: "chojo-dev-redirect" # (6)!
tls:
certresolver: my_cert_resolver # (7)!
- Wir werden einen Router erstellen, also benutzen wir den Abschnitt Router.
- Definiere einen neuen Router namens
chojo-dev-redirect
. Ich empfehle, den gleichen Namen wie die Middleware zu verwenden, aber das ist nicht erforderlich. - Füge den Dienst "noop@internal" zu unserem Router hinzu.
- Weise den
https
Eintrittspunkt
zu. Dies kann je nach deiner Einrichtung variieren. - Weise die Regel unserem Host zu
- Weise die Redirect Middleware zu, die wir zuvor definiert haben
- Weise der zugewiesenen Regel unseren Cert Resolver zu
Warnung!
Achte darauf, dass du `entrypoint`, `rule` und `certresolver` an deine Bedürfnisse anpasst!
Damit wird unser Dienst erstellt. Alles, was unserer Regel entspricht, wird nun an die in der Redirect Middleware definierte Domain weitergeleitet.
Ein Shell-Skript zur Erstellung von Weiterleitungen verwenden.
Ich verwende ein Bash-Skript, um meine Weiterleitungen zu erstellen.
Script
#!/usr/bin/env sh
read -rp "Enter the name for the router and middleware: " NAME
if [ -z "$NAME" ]; then
echo "Name cannot be empty. Exiting..."
exit 1
fi
read -rp "Enter the target URL you want to redirect to: " TARGET
if [ -z "$TARGET" ]; then
echo "Target URL cannot be empty. Exiting..."
exit 1
fi
read -rp "Enter the host that should be redirected: " HOST
if [ -z "$HOST" ]; then
echo "Host cannot be empty. Exiting..."
exit 1
fi
read -rp "Enter the cert resolver: " CERT
if [ -z "$CERT" ]; then
echo "Cert resolver cannot be empty. Exiting..."
exit 1
fi
read -rp "Do you want the redirection to be permanent? [y/N]: " PERMANENT_INPUT
PERMANENT_INPUT=${PERMANENT_INPUT:-n}
PERMANENT=false
if [ "${PERMANENT_INPUT}" = "y" ] || [ "${PERMANENT_INPUT}" = "Y" ]; then
PERMANENT=true
elif [ "${PERMANENT_INPUT}" != "n" ] && [ "${PERMANENT_INPUT}" != "N" ]; then
echo "Invalid input for permanent value."
exit 1
fi
TEXT="http:
middlewares:
${NAME}-redirect:
redirectRegex:
regex: \"(.*)\"
replacement: \"${TARGET}\"
permanent: ${PERMANENT}
routers:
${NAME}-redirect:
service: noop@internal
entrypoints: \"https\"
rule: \"Host(\`${HOST}\`)\"
middlewares: \"${NAME}-redirect\"
tls:
certresolver: ${CERT}"
echo "$TEXT" > "${NAME}-redirect.yml"
echo "$TEXT"
echo "File ${NAME}-redirect.yml created."
Lade es mit diesem command direkt auf deinen server
Warnung
Lade niemals bash scripte runter ohne einen Blick drauf zu werfen bevor du sie ausführts!
Das Bash-Skript erstellt eine Datei für jede Weiterleitung. Das macht sie leicht zu finden. Wenn du sie ändern willst, erstellst du sie einfach erneut mit demselben Namen.
Danke
Danke fürs Lesen! Wenn dir dieser Beitrag gefallen hat oder du Fragen hast, kannst du gerne in meinem Discord vorbeikommen und mit mir reden!
Oder schreib mir eine Mail an mail [at] chojo [dot] dev
.
Wenn du mich unterstützen willst, kannst du mich über GitHub unterstützen.