Перейти до основного вмісту

Випадок 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 пізніше.
  • (\(.*))?: Відповідає рядку, що починається з ?, що означає параметри запиту.
    • Це також відповідає порожньому рядку за допомогою квантифікатора ? в кінці шаблону, який відповідає нуль або один раз.
    • Зовнішні () та внутрішні () можуть посилатися за допомогою $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

⬇️ Завантажити правило

Це лише приклад. Ви також можете створити кілька правил для вирішення кожної проблеми. Це може бути набагато простіше.