Cazul 3: Adăugați parametri de interogare la URL
Să presupunem că există un site web numit example.com
care afișează un aspect mobil implicit, dar preferați aspectul desktop. Din fericire, site-ul web acceptă un parametru de interogare layout
pentru a specifica ce aspect afișează site-ul web. Să creăm o regulă care adaugă automat layout=desktop
.
Poate credeți că ați putea defini astfel:
- Redirecționare de la:
https://example.com/.*
(Expresie regulată) - Redirecționare către:
$0?layout=desktop
$0
face referire la URL-ul țintă. Dacă încercați să accesați example.com/hello
, sunteți redirecționat către example.com/hello?layout=desktop
. Această funcționalitate se numește substituție.
Substituția este disponibilă și pentru modul Joker, deoarece este convertită intern în Expresie regulată.
Cu toate acestea, există câteva probleme cu aceste setări.
Problema 1: Buclă infinită
Setarea curentă creează o buclă de redirecționare infinită, deoarece https://example.com/.*
vizează și https://example.com/hello?layout=desktop
.
În acest caz, puteți specifica un model URL exclus care vă permite să accesați fără redirecționare, cum ar fi acesta cu Expresie regulată:
.*[&?]layout=[^&]*.*
.*
: Se potrivește cu orice[&?]
: Se potrivește fie cu&
, fie cu?
[^&]*
: Se potrivește cu orice, cu excepția lui&
Problema 2: Nu poate gestiona corect parametrii existenți
Dacă URL-ul țintă are deja alți parametri de interogare, cum ar fi example.com/hello?theme=dark
, destinația va fi example.com/hello?theme=dark?layout=desktop
(Există două ?
în URL), dar puteți uni parametrii doar cu &
. ?
ca caracter special este permis doar la începutul parametrilor. Deci nu este tratat ca un parametru valid.
În acest caz, modificați setările astfel:
- Redirecționare de la:
(https://example.com/[^?]*)(\(.*))?
- Redirecționare către:
$1?layout=desktop&$3
Să aruncăm o privire pas cu pas.
(https://example.com/[^?]*)
: Se potrivește cu partea până la caracterul anterior lui?
.[^?]*
se potrivește cu orice, cu excepția lui?
.- Acesta este încadrat cu
()
astfel încât să îl puteți referenția cu$1
mai târziu.
(\(.*))?
: Se potrivește cu un șir care începe cu?
, ceea ce înseamnă parametri de interogare.- Acesta se potrivește și cu un șir gol prin cuantificatorul
?
de la sfârșitul modelului, care se potrivește de zero sau o dată. ()
exterior și()
interior pot fi referențiate cu$2
și$3
mai târziu.
- Acesta se potrivește și cu un șir gol prin cuantificatorul
RegExr vă poate ajuta să înțelegeți detaliile.
RegExr afișează o eroare atunci când nu evadați /
cu \
. Deși o puteți evada, nu este necesar, deoarece Redirect Web utilizează un motor diferit de la Apple care nu necesită evadare.
Aceasta nu este o soluție perfectă, deoarece redirecționează example.com/hello
către example.com/hello?layout=desktop&
, care include un &
inutil la sfârșitul URL-ului. Nu este o problemă mare în general, dar dacă doriți să-l eliminați, puteți utiliza Procesarea grupurilor de captură.
În concluzie, acesta este rezultatul final:
- Redirecționare de la:
(https://example.com/[^?]*)((\(.*))?)
(Expresie regulată) - Redirecționare către:
$1?layout=desktop$3
- Model URL exclus:
.*[&?]layout=[^&]*.*
(Expresie regulată) - Procesarea grupurilor de captură:
- Grup:
$3
- Proces: Înlocuire apariții
- Țintă:
\?(.*)
- Înlocuire:
&$1
- Țintă:
- Grup:
Acesta este doar un exemplu. Puteți crea și mai multe reguli pentru a gestiona fiecare problemă. Poate fi mult mai simplu.