Назад | Перейти на главную страницу

nginx rewrite добавляет параметр в конец URL-адреса

Мне нужно настроить обратный прокси-сервер, чтобы в конце 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. При простой перезаписи это действительно хорошо работает.

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

Итак, писать

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

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

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

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

Пытаться:

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

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

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

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