Я хочу установить значение 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;
}