Nginx可通过map指令结合proxy_pass实现基于域名、路径、Header等请求特征的动态后端路由:用$host区分子域名,$uri或$request_uri按路径前缀匹配,$http_x_tenant_id等自定义Header支持灰度/租户路由,并支持嵌套map实现多维度联合判断。

可以通过在 `map` 中定义变量,再结合 `proxy_pass` 指向该变量,实现基于请求特征(如域名、路径、Header)动态选择后端地址。
用 `$host` 或 `$http_host` 区分不同域名
当多个业务子域名共用一个 Nginx 实例时,可按域名映射到不同后端:
map $host $backend {
default "127.0.0.1:8001";
app1.example.com "127.0.0.1:8001";
app2.example.com "127.0.0.1:8002";
api.example.com "127.0.0.1:8003";
}
然后在 server 块中使用:
location / {
proxy_pass http://$backend;
proxy_set_header Host $host;
}
用请求路径前缀匹配后端服务
根据 URL 路径前缀(如 /v1/、/admin/)路由到不同服务:
map $request_uri $backend {
~^/v1/ "127.0.0.1:8001";
~^/admin/ "127.0.0.1:8002";
~^/api/ "127.0.0.1:8003";
default "127.0.0.1:8001";
}
注意:`$request_uri` 包含 query string,若只需路径部分,改用 `$uri` 更稳妥。
用自定义 Header 控制灰度或租户路由
例如通过 `X-Tenant-ID` 或 `X-Env` Header 决定后端实例:
map $http_x_tenant_id $backend {
"tenant-a" "127.0.0.1:8001";
"tenant-b" "127.0.0.1:8002";
default "127.0.0.1:8001";
}
配合 location 使用时,确保客户端或前置网关已透传该 Header:
- Nginx 默认不转发带下划线的 Header,需加 `underscores_in_headers on;`
- 确认 `proxy_pass_request_headers on;`(默认开启)
组合多个变量做更精细判断
单个 `map` 不支持逻辑组合,但可通过嵌套 `map` 实现(Nginx 1.11.3+ 支持):
map $host $service_group {
example.com "prod";
test.example.com "staging";
default "prod";
}
map $service_group$uri $backend {
~^prod/v1/ "127.0.0.1:8001";
~^staging/v1/ "127.0.0.1:8004";
default "127.0.0.1:8001";
}
这种写法将环境和路径联合决策,适合多环境 + 多版本共存场景。


















