nginx переписать добавить параметр в конце 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.

Идеи?

РЕДАКТИРОВАТЬ: Кажется, что это поведение существует при использовании в сочетании с proxy_pass. В простом переписывании это работает очень хорошо.

Sascha
источник

Ответы:

15
  1. В rewriteвас совпадают с URL в пути только часть. Это означает, $1что не будет содержать строку запроса.
  2. По умолчанию Nginx добавляет исходную строку запроса к замене перезаписи.

Таким образом, это должно быть безопасно писать

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

Если вы не хотите, чтобы Nginx добавлял исходную строку запроса, просто укажите ?в конце URL замены:

rewrite ^(.*)$ $1?locale=de-de? break;
Александр Азаров
источник
Спасибо! Я не видел, что я пытался сделать это неправильно.
Саша
А + это лучший ответ
спасибо
3

Соответствие для rewriteне включает параметры запроса, поэтому вам нужно проверить это в другом месте.

Пытаться:

if ($args !~* locale=de\-de){
    rewrite ^(.*)$ $1&locale=de-de last;
}
Шейн Мэдден
источник
1
"IfIsEvil": wiki.nginx.org/IfIsEvil
Александр Азаров
@ Александр Хороший вопрос; это rewriteдолжно lastбыть безопасно. Ред.
Шейн Мэдден
3

Параметр rewriteне изменяет параметры запроса, только часть пути URI. По моему опыту, путаница с переписыванием приводит к странным циклам, где новый параметр добавляется до бесконечности. Переписать, вероятно, не способ сделать это в Nginx.

Вместо этого вы должны изменить $argsпеременную, используя setдирективу:

set $args $args&locale=de-de;
Palimondo
источник
Я не согласен, что $argsдолжно быть видоизменено. Вместо этого посмотрите решение @ AlexanderAzarov.
Спасибо,