我目前正在编写一个调度程序,它将把不同的 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
$uri
map
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