我正在尝试使用重写替换特定的部分或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
答案 0 :(得分:1)
location
和rewrite
伪指令使用不包含查询字符串(从?
开始的任何内容)的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。