nginx修改并代理URL

nginx修改并代理URL

我是 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 来评估rewritelocation指令,其中不包括?以及其后的任何内容。

$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;
        ...
    }
}

相关内容