Skip to main content

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.

tip

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.

RegExr vă poate ajuta să înțelegeți detaliile.

note

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

⬇️ Descărcați regula

Acesta este doar un exemplu. Puteți crea și mai multe reguli pentru a gestiona fiecare problemă. Poate fi mult mai simplu.