我是 Ngnix 新手。请帮我弄清楚如何正确地让 nginx 修改和重定向(代理?)传入请求。重定向似乎可以正常工作,但 URL 未在目标处重写。
我的配置是:
server {
listen 91 default_server ssl;
ssl_prefer_server_ciphers on;
ssl_certificate /etc/nginx/ssl/domain.crt;
ssl_certificate_key /etc/nginx/ssl/domain.key;
location /dest {
rewrite ^a_service_prod&id_number=((1234701|1234708|1234802|1234808|1234812|1234902)\d+)&(.*?)$ /dest?service=a_service_prod.sub_service&operation=sub_service&id_number=$1&$2 break;
proxy_pass http://192.168.1.1:1440;
proxy_redirect off;
proxy_set_header Host $host;
}
}
我试图获取诸如/dest?service=a_service_prod&id_number=12347016734696&slime=somethig
被重写的请求,并将请求发送到另一台服务器http://192.168.1.1:1440/dest?service=a_service_prod.sub_service&operation=sub_service&id_number=12347016734696&slime=somethig
但在目的地,收到的是http://192.168.1.1:1440/dest?service=a_service_prod&id_number=12347016734696&slime=somethig
请问我做错了什么,我该如何解决?
答案1
您当前的方法不起作用,因为您正尝试在rewrite
指令的正则表达式中捕获查询字符串。nginx
使用规范化的 URI 来评估rewrite
和location
指令,其中不包括?
以及其后的任何内容。
$request_uri
您可以在变量、$args
变量中或在变量之间拆分来查找查询字符串$arg_xxx
。请参阅这个文件了解详情。
if
您可以使用语句或指令将正则表达式应用于其中一个变量map
。
下面的例子使用了一个map
指令(参见这个文件(详情请参阅)使用正则表达式和两个命名捕获来重建所需的参数列表。上游 URI 附加到指令中proxy_pass
(请参阅这个文件了解详情)。
map $args $newargs {
default $args;
~*^(?<prefix>service=a_service_prod)&(?<suffix>id_number=(?:1234701|1234708|1234802|1234808|1234812|1234902)\d+&.*)$ $prefix.sub_service&operation=sub_service&$suffix;
}
server {
...
location /dest {
proxy_pass http://192.168.1.1:1440$uri?$newargs;
...
}
}