Případ 3: Přidání parametrů dotazu do URL
Řekněme, že existuje webová stránka example.com
, která ve výchozím nastavení zobrazuje mobilní rozložení, ale vy preferujete její desktopové rozložení. Naštěstí webová stránka podporuje parametr dotazu layout
pro určení, jaké rozložení webová stránka zobrazí. Pojďme vytvořit pravidlo, které automaticky přidá layout=desktop
.
Možná si myslíte, že byste to mohli definovat takto:
- Přesměrovat z:
https://example.com/.*
(Regulární výraz) - Přesměrovat na:
$0?layout=desktop
$0
odkazuje na cílovou URL. Pokud se pokusíte přistoupit na example.com/hello
, budete přesměrováni na example.com/hello?layout=desktop
. Tato funkce se nazývá substituce.
Substituce je k dispozici i pro režim zástupných znaků, protože je interně převedena na regulární výraz.
Nicméně, s těmito nastaveními je několik problémů.
Problém 1: Nekonečná smyčka
Současné nastavení vytváří nekonečnou smyčku přesměrování, protože https://example.com/.*
cílí také na https://example.com/hello?layout=desktop
.
V tomto případě můžete specifikovat vyloučený vzor URL, který vám umožní přístup bez přesměrování, například takto s regulárním výrazem:
.*[&?]layout=[^&]*.*
.*
: Shoduje se s čímkoli[&?]
: Shoduje se buď s&
nebo?
[^&]*
: Shoduje se s čímkoli kromě&
Problém 2: Nelze správně zpracovat existující parametry
Pokud cílová URL již obsahuje jiné parametry dotazu jako example.com/hello?theme=dark
, cíl bude example.com/hello?theme=dark?layout=desktop
(v URL jsou dva ?
), ale parametry můžete spojit pouze pomocí &
. ?
jako speciální znak je povolen pouze na začátku parametrů. Takže není považován za platný parametr.
V tomto případě změňte nastavení takto:
- Přesměrovat z:
(https://example.com/[^?]*)(\(.*))?
- Přesměrovat na:
$1?layout=desktop&$3
Pojďme se podívat krok za krokem.
(https://example.com/[^?]*)
: Shoduje se s částí až do předchozího znaku?
.[^?]*
se shoduje s čímkoli kromě?
.- Toto je zabaleno do
()
, takže na to můžete později odkazovat pomocí$1
.
(\(.*))?
: Shoduje se s řetězcem začínajícím?
, což znamená parametry dotazu.- Toto se také shoduje s prázdným řetězcem pomocí kvantifikátoru
?
na konci vzoru, který shoduje nula nebo jedenkrát. - Vnější
()
a vnitřní()
lze později odkazovat pomocí$2
a$3
.
- Toto se také shoduje s prázdným řetězcem pomocí kvantifikátoru
RegExr vám může pomoci pochopit podrobnosti.
RegExr zobrazuje chybu, když neescapujete /
pomocí \
. Ačkoli to můžete escapovat, není to vyžadováno, protože Redirect Web používá jiný engine od Apple, který escapování nevyžaduje.
Toto není dokonalé řešení, protože přesměrovává example.com/hello
na example.com/hello?layout=desktop&
, což obsahuje zbytečné &
na konci URL. Obecně to není velký problém, ale pokud si přejete ho odstranit, můžete použít Zpracování zachycené skupiny.
Závěrem, toto je konečný výstup:
- Přesměrovat z:
(https://example.com/[^?]*)((\(.*))?)
(Regulární výraz) - Přesměrovat na:
$1?layout=desktop$3
- Vyloučený vzor URL:
.*[&?]layout=[^&]*.*
(Regulární výraz) - Zpracování zachycené skupiny:
- Skupina:
$3
- Proces: Nahradit výskyty
- Cíl:
\?(.*)
- Náhrada:
&$1
- Cíl:
- Skupina:
Toto je pouze příklad. Můžete také vytvořit více pravidel pro řešení každého problému. Může to být mnohem jednodušší.