nginx rewrite додайте параметр в кінці URL-адреси


13

Мені потрібно налаштувати свій зворотний проксі-сервер, щоб наступний параметр був доданий в кінці URL-адреси: &locale=de-de

Це майже працює:

rewrite ^(.*)$ $1&locale=de-de break;

Однак проблема полягає в тому, що мені потрібно додати "& locale = de-de" лише в тому випадку, якщо його вже немає і якщо є "?" в URL-адресі ...

Чи можу я отримати допомогу щодо формулювання правильного регулярного виразу для цього?

Інше питання: Чому знак запитання в моєму URL-адресі не відображається, якщо я використовую це:
$ uri? $ Args

Або $ uri $ is_args $ args переводить URL, який не кодується, і знак питання відображається як% 3f.

Ідеї?

EDIT: Схоже, така поведінка існує під час використання в поєднанні з proxy_pass. У простому переписанні це працює дуже добре.

Відповіді:


15
  1. У rewriteвас збігаються з URL в шляху тільки частина. Це означає, що $1не буде містити рядок запиту.
  2. За замовчуванням Nginx додає оригінальний рядок запиту до заміни перепису.

Отже, писати слід безпечно

rewrite ^(.*)$ $1?locale=de-de break;

У випадку, якщо ви не хочете, щоб Nginx додавав початковий рядок запиту, просто вкажіть ?в кінці замісної URL-адреси:

rewrite ^(.*)$ $1?locale=de-de? break;

Дякую! Я не бачив, що намагався зробити це неправильно.
Саша

A + це найкраща відповідь
Дякую

3

Збіг rewriteне містить параметри запитів, тому вам потрібно перевірити їх на іншому місці.

Спробуйте:

if ($args !~* locale=de\-de){
    rewrite ^(.*)$ $1&locale=de-de last;
}


@ Олександр Хороший момент; що rewriteпотрібно lastбути безпечним. Відредаговано.
Шейн Мадден

3

Параметр rewriteзапиту не змінює, лише частину шляху URI. На мій досвід, псування з переписувачами призводить до дивних циклів, де новий параметр додається ad infinitum. Переписувати, мабуть, це не спосіб зробити це в Nginx.

Натомість слід змінити $argsзмінну за допомогою setдирективи:

set $args $args&locale=de-de;

Я не погоджуюся з тим, що $argsслід мутувати. Натомість див. Рішення @ Олександра Азарова.
Дякую
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.