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

Как установить определенную пару ключ-значение для каждого HTML, отправляемого nginx, без потери других пар ключ-значение?

Я хочу установить значение mode в каждой строке поиска html с использованием nginx. Я написал такие коды:

 if ( $arg_mode !~ test ){
     rewrite ^(?:/(.*)\.html)?$ /$1.html?mode=test? redirect;
 }

Но это приведет к потере других пар ключ-значение.

Например, если я запрашиваю URL

http://xxx.xx.xx/weather/bug.html?code=12345&mode=mess

Я хотел получить

http://xxx.xx.xx/weather/bug.html?code=12345&mode=test

но я получаю

http://xxx.xx.xx/weather/bug.html?mode=test

вместо.

Код пары "ключ-значение" = 12345 потерян.

Как я могу это исправить?

Вы можете запустить регулярное выражение по всему $args строку и извлеките термины перед и за mode параметр. Я использовал именованные захваты, чтобы они оставались действительными в пределах rewrite директива. И для ясности я не использовал группировки без захвата.

if ($args ~ ^(?<front>.*&)?mode=(?!test)([^&]*)(?<back>&.*)?$ ) {
    rewrite ^ $uri?${front}mode=test${back}? last;
}

Примечание: используйте redirect или permanent вместо того last для достижения внешнего перенаправления.

Это в значительной степени то, что вы хотите. Он позволяет избежать цикла перенаправления за счет использования отрицательного прямого утверждения. mode=test.

Другой вариант - использовать if директива в location блок, обрабатывающий запрос, и в этом случае break вместо этого можно использовать, что также позволяет избежать цикла перенаправления. Такие как:

if ($args ~ ^(?<front>.*&)?mode=([^&]*)(?<back>&.*)?$ ) {
    rewrite ^ $uri?${front}mode=test${back}? break;
}