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