将一部分request_uri传递给proxy_pass

时间:2019-07-30 22:53:33

标签: nginx nginx-reverse-proxy

我正在尝试使用重写替换特定的部分或request_uri,但是由于某些原因它无法正常工作

示例网址:http://example.com:3000/?soft=55191&src1=changethis&src2=HOME&type=0&id=7700458

server {

       server_name example.com;
       listen 3000;

    location / {
        resolver 8.8.8.8;
        rewrite ^(?<=&src1=)(.*)(?=&src2)$ changewiththis$1 break;
        proxy_pass http://example2.com;
    }

}

所以这里的目标是替换'src1 ='和'&src2'之间的确切字符串,以便可以使用更改后的字符串将其传递给proxy_pass

1 个答案:

答案 0 :(得分:1)

locationrewrite伪指令使用不包含查询字符串(从?开始的任何内容)的normalised URI

要操作查询字符串,您需要查看$request_uri$args变量,或使用$arg_变量家族(例如$arg_src1 )。

最简单的解决方案可能是在向上游传递新值之前,使用map指令来操纵$request_uri

例如:

map $request_uri $changethis {
default                                           $request_uri;
~(?<prefix>.*[?](|.*&)src1)=[^&]*(?<suffix>.*)$   $prefix=newvalue$suffix;
}

server {
    ...
    location / {
        resolver ...;
        proxy_pass http://example.com$changethis;
    }
}

有关详细信息,请参见this document