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

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

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

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