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$1mai 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$3mai 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.