Преминете към основното съдържание

Случай 3: Добавяне на параметри за заявка към URL адрес

Да кажем, че има уебсайт example.com, който по подразбиране показва мобилно оформление, но вие предпочитате настолното му оформление. За щастие, уебсайтът поддържа параметър за заявка layout, за да укаже кое оформление да показва. Нека създадем правило, което автоматично добавя layout=desktop.

Може би си мислите, че можете да го дефинирате по следния начин:

  • Пренасочване от: https://example.com/.* (Регулярен израз)
  • Пренасочване към: $0?layout=desktop

$0 препраща към целевия URL адрес. Ако се опитате да достъпите example.com/hello, ще бъдете пренасочени към example.com/hello?layout=desktop. Тази функция се нарича заместване.

Съвет

Заместването е налично и за режим Уайлдкард, тъй като вътрешно се преобразува в Регулярен израз.

Въпреки това, има няколко проблема с тези настройки.

Проблем 1: Безкраен цикъл

Текущата настройка създава безкраен цикъл на пренасочване, тъй като https://example.com/.* също така таргетира https://example.com/hello?layout=desktop.

В този случай можете да зададете изключен URL шаблон, който ви позволява да достъпвате без пренасочване, като този с Регулярен израз:

.*[&?]layout=[^&]*.*
  • .*: Съвпада с всичко
  • [&?]: Съвпада с & или ?
  • [^&]*: Съвпада с всичко освен &

Проблем 2: Не може да обработва правилно съществуващи параметри

Ако целевият URL адрес вече има други параметри за заявка като example.com/hello?theme=dark, дестинацията ще бъде example.com/hello?theme=dark?layout=desktop (Има две ? в URL адреса), но можете да свържете параметрите само с &. ? като специален знак е разрешен само в началото на параметрите. Така че не се третира като валиден параметър.

В този случай променете настройките по следния начин:

  • Пренасочване от: (https://example.com/[^?]*)(\(.*))?
  • Пренасочване към: $1?layout=desktop&$3

Нека разгледаме стъпка по стъпка.

  • (https://example.com/[^?]*): Съвпада с частта до предишния знак на ?.
    • [^?]* съвпада с всичко освен ?.
    • Това е обвито с () така че можете да го реферирате с $1 по-късно.
  • (\(.*))?: Съвпада с низ, започващ с ?, което означава параметри за заявка.
    • Това също съвпада с празен низ чрез квантификатора ? в края на шаблона, който съвпада нула или един път.
    • Външните () и вътрешните () могат да бъдат реферирани с $2 и $3 по-късно.

RegExr може да ви помогне да разберете подробностите.

Бележка

RegExr показва грешка, когато не екранирате / с \. Въпреки че можете да го екранирате, това не е задължително, тъй като Redirect Web използва различен двигател от Apple, който не изисква екраниране.

Това не е перфектно решение, тъй като пренасочва example.com/hello към example.com/hello?layout=desktop&, което включва ненужен & в края на URL адреса. Това не е голям проблем като цяло, но ако желаете да го премахнете, можете да използвате Обработка на групи за улавяне.

В заключение, това е крайният резултат:

  • Пренасочване от: (https://example.com/[^?]*)((\(.*))?) (Регулярен израз)
  • Пренасочване към: $1?layout=desktop$3
  • Изключен URL шаблон: .*[&?]layout=[^&]*.* (Регулярен израз)
  • Обработка на групи за улавяне:
    • Група: $3
    • Процес: Замяна на срещания
      • Цел: \?(.*)
      • Заместване: &$1

⬇️ Изтеглете правилото

Това е просто пример. Можете също така да създадете множество правила за справяне с всеки проблем. Може да бъде много по-просто.