Я хочу установить значение 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;
}
Примечание: используйте перенаправление
или постоянное
вместо последнее
для достижения внешнего перенаправления.
] Это в значительной степени делает то, что вы хотите. Это позволяет избежать цикла перенаправления с помощью отрицательного прямого утверждения mode = test
.
Другой альтернативой является использование директивы if
в блоке location
который обрабатывает запрос, и в этом случае вместо него можно использовать перерыв
, что также позволяет избежать цикла перенаправления. Например:
if ($args ~ ^(?<front>.*&)?mode=([^&]*)(?<back>&.*)?$ ) {
rewrite ^ $uri?${front}mode=test${back}? break;
}