Ваша существующая схема дает сбой, поскольку все знаки +
являются необязательными.
Если вы хотите перенаправить свой URI на тот, где все знаки +
заменены на %20
, вы можетепросто используйте пробел и позвольте Nginx и / или браузеру обрабатывать кодировку.
Например:
if ($args ~ ^(.*)\+(.*)$) { return 302 "$uri?$1 $2"; }
Перенаправление рекурсивно, пока все знаки +
не будут заменены.
Если вы намерены исправить URI без перенаправления, чтобы только вышестоящий сервер увидел знаки +
, замененные на %20
, вместо этого используйте rewrite...last
.
Например:
if ($args ~ ^(?<first>.*)\+(?<second>.*)$) {
rewrite ^(.*)$ "$1?$first%20$second?" last;
}
В этом случае необходимо использовать именованные захваты в первом регулярном выражении, чтобы их можно было использовать во втором.Подробнее см. в этом документе .