Tapaus 3: Lisää kyselyparametreja URL-osoitteeseen
Oletetaan, että on olemassa verkkosivusto nimeltä example.com
, joka näyttää oletuksena mobiilinäkymän, mutta pidät enemmän työpöytänäkymästä. Onneksi verkkosivusto tukee layout
-kyselyparametria, jolla voi määrittää, minkä näkymän verkkosivusto näyttää. Luodaan sääntö, joka lisää layout=desktop
automaattisesti.
Ehkä ajattelet, että voisit määrittää sen seuraavasti:
- Uudelleenohjaa kohteesta:
https://example.com/.*
(Säännöllinen lauseke) - Uudelleenohjaa kohteeseen:
$0?layout=desktop
$0
viittaa kohde-URL-osoitteeseen. Jos yrität avata example.com/hello
, sinut ohjataan uudelleen osoitteeseen example.com/hello?layout=desktop
. Tätä ominaisuutta kutsutaan sijoitukseksi.
Sijoitus on käytettävissä myös Wildcard-tilassa, koska se muunnetaan sisäisesti säännölliseksi lausekkeeksi.
Näissä asetuksissa on kuitenkin muutama ongelma.
Ongelma 1: Ikuinen silmukka
Nykyinen asetus luo ikuisen uudelleenohjaussilmukan, koska https://example.com/.*
kohdistuu myös osoitteeseen https://example.com/hello?layout=desktop
.
Tässä tapauksessa voit määrittää poissuljetun URL-kuvion, joka sallii pääsyn ilman uudelleenohjausta, kuten tämä säännöllisellä lausekkeella:
.*[&?]layout=[^&]*.*
.*
: Vastaa mitä tahansa[&?]
: Vastaa joko&
tai?
[^&]*
: Vastaa mitä tahansa paitsi&
Ongelma 2: Ei pysty käsittelemään olemassa olevia parametreja oikein
Jos kohde-URL-osoitteessa on jo muita kyselyparametreja, kuten example.com/hello?theme=dark
, kohde on example.com/hello?theme=dark?layout=desktop
(URL-osoitteessa on kaksi ?
), mutta parametrit voi yhdistää vain &
:llä. ?
erikoismerkkinä on sallittu vain parametrien alussa. Siksi sitä ei käsitellä kelvollisena parametrina.
Tässä tapauksessa muuta asetuksia näin:
- Uudelleenohjaa kohteesta:
(https://example.com/[^?]*)(\(.*))?
- Uudelleenohjaa kohteeseen:
$1?layout=desktop&$3
Katsotaanpa askel askeleelta.
(https://example.com/[^?]*)
: Vastaa osaa?
:n edelliseen merkkiin asti.[^?]*
vastaa mitä tahansa paitsi?
.- Tämä on kääritty
()
-merkkien sisään, joten voit viitata siihen$1
:llä myöhemmin.
(\(.*))?
: Vastaa merkkijonoa, joka alkaa?
:llä, mikä tarkoittaa kyselyparametreja.- Tämä vastaa myös tyhjää merkkijonoa kuvion lopussa olevan
?
-kvantifikaattorin avulla, joka vastaa nolla tai yksi kertaa. - Ulompaan
()
-merkkiin ja sisempään()
-merkkiin voidaan viitata$2
:lla ja$3
:lla myöhemmin.
- Tämä vastaa myös tyhjää merkkijonoa kuvion lopussa olevan
RegExr voi auttaa sinua ymmärtämään yksityiskohdat.
RegExr näyttää virheen, kun et pakene /
-merkkiä \
:llä. Vaikka voit paeta sen, sitä ei vaadita, koska Redirect Web käyttää Applen eri moottoria, joka ei vaadi pakenemista.
Tämä ei ole täydellinen ratkaisu, koska se ohjaa example.com/hello
uudelleen osoitteeseen example.com/hello?layout=desktop&
, joka sisältää tarpeettoman &
-merkin URL-osoitteen lopussa. Se ei ole yleensä iso juttu, mutta jos haluat poistaa sen, voit käyttää Sieppausryhmän käsittelyä.
Yhteenvetona, tämä on lopullinen tulos:
- Uudelleenohjaa kohteesta:
(https://example.com/[^?]*)((\(.*))?)
(Säännöllinen lauseke) - Uudelleenohjaa kohteeseen:
$1?layout=desktop$3
- Poissuljettu URL-kuvio:
.*[&?]layout=[^&]*.*
(Säännöllinen lauseke) - Sieppausryhmän käsittely:
- Ryhmä:
$3
- Prosessi: Korvaa esiintymät
- Kohde:
\?(.*)
- Korvaava:
&$1
- Kohde:
- Ryhmä:
Tämä on vain esimerkki. Voit myös luoda useita sääntöjä kunkin ongelman käsittelemiseksi. Se voi olla paljon yksinkertaisempaa.