Как установить определенную пару "ключ-значение" для каждого 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 потерян.

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

2
задан 15 December 2015 в 17:25
1 ответ

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

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

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

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

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

if ($args ~ ^(?<front>.*&)?mode=([^&]*)(?<back>&.*)?$ ) {
    rewrite ^ $uri?${front}mode=test${back}? break;
}
0
ответ дан 3 December 2019 в 14:34

Теги

Похожие вопросы