Nginx 重写以删除第一个(通用)路径节点

Nginx 重写以删除第一个(通用)路径节点

我目前正在编写一个调度程序,它将把不同的 URL 调度到特定的服务 URL。

我本质上想要发送类似这样的内容:

POST http://nginx/awesome_service/a/lot/of/params/and?so=on

POST http://awesome_service/a/lot/of/params/and?so=on

我已经通过硬编码服务名称实现了:

location /awesome_service {
    rewrite ^/awesome_service(/.*)$ $1 break;
    proxy_pass http://awesome_service;
}

但是,我有不同名称的不同服务,并且我不想重复路线。

我使用了一个从名称到 URL 的映射:

map $uri $service_url {
  ~^/awesome_service/ "http://awesome_service";
  ~^/mediocre_service/ "http://mediocre_service";
}

因此很容易调度到一个变量代理url:

location /awesome_service {
    rewrite ^/awesome_service(/.*)$ $1 break;
    proxy_pass $service_url;
}

然而,我仍在努力重写。

这是我目前想到的:

location ~ ^/([^\/]+)/.* {
    set $service $1;
    rewrite ^/$service(/.*)$ $1 break;
    proxy_pass $service_url;
}

请求被捕获并传递。但重写失败。服务仍然看到 URL 的第一部分。

是否可能与正则表达式混淆或者我传递了错误的变量?

答案1

rewrite您的块中的location会首先被评估,然后才会使用。这就是您的块无法与 一起使用的proxy_pass原因。因为当触发块时,URL 已被重写。我的实验室中有此配置,其工作正常:map$urimap

map $custom_service $custom_backend {
        google "https://www.google.com";
        bing "https://www.bing.com";
}
location ~ ^/([^\/]+)/.* {
        set $custom_service $1;
        rewrite ^/[^\/]+(/.*)$ $1 break;
        proxy_pass $custom_backend;
}

map进入http块,location块进入server块。

您的 URL 如下所示:

http://nginx/google/some/params -> backend is now -> https://www.google.com/some/params
http://nginx/bing/some/params -> backend is now -> https://www.bing.com/some/params

相关内容