首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过NGINX替换请求参数中的指定字符

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

Stack Overflow用户
提问于 2019-02-15 07:29:27
回答 1查看 1.8K关注 0票数 1

我试图将参数部分中的特定字符(+ +符号)替换为空格字符(%20)。我重写了path部分,但是在测试过程中,我了解到NGINX之后不会更改参数。签名(我是NGINX的新手)。

我试着为部分配置的args做这件事,但是它不像它应该的那样工作,它增加了$20,直到我得到错误页面没有正确地重定向。

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

代码语言:javascript
复制
func=autocomplete&q=<(unlimited number of letters and plus signs (mostly 4-5 plus signs)>&key_lic=xxxxx

NGINX配置中的代码如下。

代码语言:javascript
复制
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/;
 }

谢谢你给我的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-16 13:49:36

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

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

例如:

代码语言:javascript
复制
if ($args ~ ^(.*)\+(.*)$) { return 302 "$uri?$1 $2"; }

重定向是递归的,直到替换了所有+符号。

如果您打算在不重定向的情况下更正URI,这样只有上游服务器才能看到+符号被%20替换,那么使用rewrite...last代替。

例如:

代码语言:javascript
复制
if ($args ~ ^(?<first>.*)\+(?<second>.*)$) { 
    rewrite ^(.*)$ "$1?$first%20$second?" last; 
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54704488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档