Перейти к основному содержимому

Случай 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

⬇️ Загрузить правило

Это всего лишь пример. Вы также можете создать несколько правил для решения каждой проблемы. Это может быть намного проще.