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

时间:2019-02-15 07:29:28

标签: nginx args

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

我尝试在配置的args部分执行此操作,但是它没有按预期工作,它会增加20美元,直到我收到错误消息,指出页面未正确重定向。

我收到的请求URL始终相同。

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

NGINX配置中的代码如下。

location /autocomplete/luka/ {
        if ($args ~* "^([^+]*)(\+?)([^+]*)(\+?)([^+]*)(\+?)(.*)$"){
                set $args $1%20$3%20$5%20$7;
                rewrite  (.*)$ $1 redirect;
         }
        proxy_pass http://link.where.to.finish/wm2/;
 }

谢谢您能得到我的帮助。

1 个答案:

答案 0 :(得分:1)

您现有的方案失败了,因为所有+符号都是可选的。

如果您想将URI重定向到所有+%20代替的URI,则只需使用一个空格,然后让Nginx和/或浏览器处理编码。< / p>

例如:

if ($args ~ ^(.*)\+(.*)$) { return 302 "$uri?$1 $2"; }

重定向是递归的,直到所有+符号都被替换为止。


如果您打算在不进行重定向的情况下更正URI,以便仅上游服务器看到由+代替的%20符号,请改用rewrite...last

例如:

if ($args ~ ^(?<first>.*)\+(?<second>.*)$) { 
    rewrite ^(.*)$ "$1?$first%20$second?" last; 
}

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