Nginx多租户路径重写核心是将租户标识(子域名/路径前缀/请求头)映射为后端隔离路径或参数,通过location匹配、rewrite、proxy_pass和proxy_set_header组合实现上下文透传与动态路由。

多租户系统路径重写,核心是把租户标识(如子域名、路径前缀或请求头)映射到后端服务的隔离路径或参数中。Nginx 本身不管理租户逻辑,但可通过 location 匹配 + rewrite + proxy_pass + proxy_set_header 组合,将租户上下文透传给后端。
按子域名提取租户并注入 Host 或 Header
适合租户使用独立子域名(如 tenant1.example.com)。Nginx 提取子域名,改写 Host 或添加自定义头供后端识别:
- 用
$host或正则捕获租户名:set $tenant $1;配合if ($host ~ ^([a-z0-9]+)\.example\.com$) { set $tenant $1; } - 重写 Host 头为统一后端域名:
proxy_set_header Host backend.example.com; - 注入租户标识到请求头:
proxy_set_header X-Tenant-ID $tenant;(后端据此路由或鉴权)
按路径前缀分离租户(如 /t/{tenant}/api)
租户路径显式暴露,需剥离前缀再转发,同时保留租户上下文:
- 匹配并捕获租户名:
location ~ ^/t/(?<tenant>[a-z0-9]+)/(.*)$ {</tenant> - 重写 URI 去掉租户前缀:
rewrite ^/t/[^/]+/(.*)$ /$1 break; - 转发时携带租户信息:
proxy_set_header X-Tenant-ID $tenant; - proxy_pass 必须不带路径(只写地址),否则正则 location 下会报错:
proxy_pass http://backend-service;
统一入口 + 动态后端路由(高级场景)
当租户对应不同后端服务(如 tenant1 → service-a,tenant2 → service-b),可结合 map 指令做动态 upstream:
- 定义租户到上游的映射:
map $tenant $upstream { default backend-default; tenant1 backend-a; tenant2 backend-b; } - 在 location 中引用:
proxy_pass http://$upstream; - 配合 rewrite 或 proxy_set_header,确保后端收到原始租户标识与干净路径
注意事项
避免常见陷阱:
- 正则 location 中
proxy_pass末尾不能带路径(如http://x/y/),否则 Nginx 报错;路径替换必须靠rewrite ... break -
rewrite后加break是关键——它终止当前 location 内的重写循环,防止再次匹配其他 location - 租户标识若来自请求头(如
X-Tenant),可用map $http_x_tenant $tenant { ... }提取并标准化 - 所有重写操作应在
location块内完成,避免跨块变量丢失


















