Случай 3: Добавление параметров запроса к URL
Предположим, есть веб-сайт example.com
, который по умолчанию отображает мобильную версию, но вы предпочитаете настольную. К счастью, веб-сайт поддерживает параметр запроса layout
для указания того, какой макет отображать. Давайте создадим правило, которое автоматически добавляет layout=desktop
.
Возможно, вы думаете, что можете определить это следующим образом:
- Перенаправить с:
https://example.com/.*
(Регулярное выражение) - Перенаправить на:
$0?layout=desktop
$0
ссылается на целевой URL. Если вы попытаетесь получить доступ к example.com/hello
, вы будете перенаправлены на example.com/hello?layout=desktop
. Эта функция называется подстановкой.
Подстановка также доступна для режима Wildcard, поскольку он внутренне преобразуется в регулярное выражение.
Однако с этими настройками есть несколько проблем.
Проблема 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
позже.
(\(?.*))?
: Соответствует строке, начинающейся с?
, что означает параметры запроса.- Это также соответствует пустой строке с помощью квантификатора
?
в конце шаблона, который соответствует нулю или одному разу. - Внешние
()
и внутренние()
могут быть referenced с помощью$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
- Цель:
- Группа:
Это всего лишь пример. Вы также можете создать несколько правил для решения каждой проблемы. Это может быть намного проще.