Quiero reemplazar cada + con (espacio) en $args .
Conozco la solución de
if ($args ~ ^(.*)\+(.*)$) { return 301 "$uri?$1 $2"; } Sin embargo, eso no es ideal porque hay una redirección para cada + . ¿Hay una solución mejor?
Podría usar más de una expresión regular. Cada expresión regular prueba el parámetro $args para uno, dos, tres, etc. + caracteres (evaluados en orden inverso), lo que minimizará la recursividad.
Una solución compacta utiliza un map para definir las expresiones regulares.
Por ejemplo:
map $args $spaces { default 0; ~^(.*)\+(.*)\+(.*)\+(.*)\+(.*)$ "$1 $2 $3 $4 $5"; ~^(.*)\+(.*)\+(.*)\+(.*)$ "$1 $2 $3 $4"; ~^(.*)\+(.*)\+(.*)$ "$1 $2 $3"; ~^(.*)\+(.*)$ "$1 $2"; } server { ... if ($spaces) { return 301 "$uri?$spaces"; } ... } Puede utilizar más o menos expresiones regulares para optimizar la solución. Lo anterior generará una redirección de hasta cuatro + caracteres y dos redirecciones de entre cinco y ocho + caracteres, y así sucesivamente.
Vea este documento para más detalles.