Случай 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
- Цел:
- Група:
Това е просто пример. Можете също така да създадете множество правила за справяне с всеки проблем. Може да бъде много по-просто.