Случай 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 показывает ошибку, когда вы не экранируете / с помощью \. Хотя вы можете экранировать его, это не требуется, поскольку RedirectWeb использует другой движок от Apple, который не требует экранирования.
Это не идеальное решение, так как оно перенаправляет example.com/hello на example.com/hello?layout=desktop&, что включает ненужный & в конце URL. В целом это не имеет большого значения, но если вы хотите удалить его, вы можете использовать Обработку захватываемых групп.
В заключение, это окончательный результат:
- Перенаправить с:
(https://example.com/[^?]*)((\(?.*))?)(Регулярное выражение) - Перенаправить на:
$1?layout=desktop$3 - Исключенный шаблон URL:
.*[&?]layout=[^&]*.*(Регулярное выражение) - Обработка захватываемых групп:
- Группа:
$3 - Процесс: Замена вхождений
- Цель:
\?(.*) - Замена:
&$1
- Цель:
- Группа:
Это всего лишь пример. Вы также можете создать несколько правил для решения каждой проблемы. Это может быть намного проще.