Fall 3: Abfrageparameter zur URL hinzufügen
Nehmen wir an, es gibt eine Website namens example.com
, die standardmäßig ein mobiles Layout anzeigt, Sie aber das Desktop-Layout bevorzugen. Glücklicherweise unterstützt die Website einen Abfrageparameter layout
, um anzugeben, welches Layout die Website anzeigt. Erstellen wir eine Regel, die layout=desktop
automatisch hinzufügt.
Vielleicht denken Sie, Sie könnten es wie folgt definieren:
- Umleiten von:
https://example.com/.*
(Regulärer Ausdruck) - Umleiten zu:
$0?layout=desktop
$0
verweist auf die Ziel-URL. Wenn Sie versuchen, auf example.com/hello
zuzugreifen, werden Sie zu example.com/hello?layout=desktop
weitergeleitet. Diese Funktion wird als Substitution bezeichnet.
Substitution ist auch für den Wildcard-Modus verfügbar, da er intern in einen regulären Ausdruck umgewandelt wird.
Es gibt jedoch einige Probleme mit diesen Einstellungen.
Problem 1: Endlosschleife
Die aktuelle Einstellung erzeugt eine Endlosschleife, da https://example.com/.*
auch auf https://example.com/hello?layout=desktop
abzielt.
In diesem Fall können Sie ein ausgeschlossenes URL-Muster angeben, das den Zugriff ohne Umleitung ermöglicht, wie hier mit regulärem Ausdruck:
.*[&?]layout=[^&]*.*
.*
: Passt zu allem[&?]
: Passt zu&
oder?
[^&]*
: Passt zu allem außer&
Problem 2: Kann vorhandene Parameter nicht richtig verarbeiten
Wenn die Ziel-URL bereits andere Abfrageparameter wie example.com/hello?theme=dark
enthält, wird das Ziel example.com/hello?theme=dark?layout=desktop
sein (es gibt zwei ?
in der URL), aber Sie können die Parameter nur mit &
verbinden. ?
als Sonderzeichen ist nur am Anfang der Parameter erlaubt. Es wird also nicht als gültiger Parameter behandelt.
Ändern Sie in diesem Fall die Einstellungen wie folgt:
- Umleiten von:
(https://example.com/[^?]*)(\(.*))?
- Umleiten zu:
$1?layout=desktop&$3
Schauen wir es uns Schritt für Schritt an.
(https://example.com/[^?]*)
: Passt zu dem Teil bis zum vorherigen Zeichen von?
.[^?]*
passt zu allem außer?
.- Dies ist mit
()
umwickelt, so dass Sie es später mit$1
referenzieren können.
(\(.*))?
: Passt zu einer Zeichenfolge, die mit?
beginnt, was Abfrageparameter bedeutet.- Dies passt auch zu einer leeren Zeichenfolge durch den
?
-Quantifizierer am Ende des Musters, der null oder einmal passt. - Die äußeren
()
und die inneren()
können später mit$2
und$3
referenziert werden.
- Dies passt auch zu einer leeren Zeichenfolge durch den
RegExr kann Ihnen helfen, die Details zu verstehen.
RegExr zeigt einen Fehler an, wenn Sie /
nicht mit \
escapen. Obwohl Sie es escapen können, ist es nicht erforderlich, da Redirect Web eine andere Engine von Apple verwendet, die kein Escaping erfordert.
Dies ist keine perfekte Lösung, da sie example.com/hello
zu example.com/hello?layout=desktop&
umleitet, was ein unnötiges &
am Ende der URL enthält. Das ist im Allgemeinen kein großes Problem, aber wenn Sie es entfernen möchten, können Sie die Verarbeitung von Erfassungsgruppen verwenden.
Zusammenfassend ist dies die endgültige Ausgabe:
- Umleiten von:
(https://example.com/[^?]*)((\(.*))?)
(Regulärer Ausdruck) - Umleiten zu:
$1?layout=desktop$3
- Ausgeschlossenes URL-Muster:
.*[&?]layout=[^&]*.*
(Regulärer Ausdruck) - Verarbeitung von Erfassungsgruppen:
- Gruppe:
$3
- Prozess: Vorkommen ersetzen
- Ziel:
\?(.*)
- Ersetzung:
&$1
- Ziel:
- Gruppe:
Dies ist lediglich ein Beispiel. Sie können auch mehrere Regeln erstellen, um jedes Problem zu lösen. Es kann viel einfacher sein.