Випадок 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
- Ціль:
- Група:
Це лише приклад. Ви також можете створити кілька правил для вирішення кожної проблеми. Це може бути набагато простіше.