通过NGINX替换请求参数中的指定字符

通过NGINX替换请求参数中的指定字符,nginx,args,Nginx,Args,我正在尝试将参数部分中的特定字符(+加号)替换为空格字符(%20)。 我对路径部分进行了重写,但在测试时,我了解到NGINX在之后不会更改参数?签名(我是NGINX的新手) 我试着在配置的args部分这样做,但它不能正常工作,它增加了20美元,直到我得到错误,页面没有正确重定向 我收到的请求URL)总是相同的 func=autocomplete&q=<(unlimited number of letters and plus signs (mostly 4-5 plus signs

我正在尝试将参数部分中的特定字符(+加号)替换为空格字符(%20)。 我对路径部分进行了重写,但在测试时,我了解到NGINX在之后不会更改参数?签名(我是NGINX的新手)

我试着在配置的args部分这样做,但它不能正常工作,它增加了20美元,直到我得到错误,页面没有正确重定向

我收到的请求URL)总是相同的

func=autocomplete&q=<(unlimited number of letters and plus signs (mostly 4-5 plus signs)>&key_lic=xxxxx

感谢您对我的帮助。

您现有的方案失败,因为所有的
+
标志都是可选的

如果要将URI重定向到所有
+
符号都被
%20
替换的URI,可以使用空格,让Nginx和/或浏览器处理编码

例如:

if ($args ~ ^(.*)\+(.*)$) { return 302 "$uri?$1 $2"; }
if ($args ~ ^(?<first>.*)\+(?<second>.*)$) { 
    rewrite ^(.*)$ "$1?$first%20$second?" last; 
}
重定向是递归的,直到所有的
+
符号都被替换


如果您打算在不重定向的情况下更正URI,以便只有上游服务器才能看到由
%20
替换的
+
符号,请改用
重写…最后一个

例如:

if ($args ~ ^(.*)\+(.*)$) { return 302 "$uri?$1 $2"; }
if ($args ~ ^(?<first>.*)\+(?<second>.*)$) { 
    rewrite ^(.*)$ "$1?$first%20$second?" last; 
}
if($args~^(?.*)\+(?.*)$){
重写^(.*)“$1?$first%20$second?”last;
}

在这种情况下,有必要在第一个正则表达式中使用命名捕获,以便在第二个正则表达式中使用它们。有关详细信息,请参阅。

非常感谢您澄清我的错误并回答我的问题。你的解决方案解决了我的问题。