Nginx实现多业务线统一安全出口收口,核心是通过server_name匹配多域名+proxy_pass转发至统一网关,而非依赖rewrite跳转;rewrite仅用于强制HTTPS、路径标准化等辅助清洗,真正的路由与安全策略由上游网关执行。

在 Nginx 中通过 Rewrite 规则实现多业务线域名的统一安全出口收口,核心不是靠 Rewrite 做跳转或重写路径,而是用 server_name + proxy_pass 配合统一网关层(如 WAF、鉴权中间件)来完成“收口”。Rewrite 在这里更多是辅助做请求标准化(如强制 HTTPS、统一 Host 头、路径归一),真正的“出口收口”依赖反向代理和集中式安全策略。
明确收口目标:谁在出口?收什么口?
所谓“统一安全出口”,是指所有业务线(如 shop.example.com、api.example.com、admin.example.com)的流量,不直接暴露后端服务,而是全部经由一个受控的 Nginx 网关节点转发,并在此节点上统一执行 TLS 卸载、IP 黑白名单、JWT 校验、请求限流等安全动作。
- 收口 ≠ 改域名,而是让所有业务域名都指向同一组 Nginx 实例(或集群)
- 不建议用 rewrite 把多个域名 301 跳到一个域名(破坏语义、影响 SEO 和 CORS),应保持原 host 透传给上游
- 真正起作用的是 server 块的匹配 + proxy_pass 转发,rewrite 只负责“整理请求”
配置多域名共用同一网关入口
在同一个 server 块中监听 443(HTTPS),用 server_name 列出所有业务线域名,Nginx 自动按 Host 匹配路由:
server {
listen 443 ssl;
server_name shop.example.com api.example.com admin.example.com;
<pre class="brush:php;toolbar:false;">ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 强制标准化:统一去除末尾斜杠、小写 path(可选)
rewrite ^(.*)/$ $1 permanent;
rewrite ^/(.*)$ /$1 break;
location / {
proxy_pass https://upstream-gateway; # 指向统一网关服务(如 Kong、自研鉴权服务)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}}
- 多个域名写在同一 server_name 后,Nginx 会根据请求中的 Host 字段自动识别归属
- proxy_set_header Host $host 保留原始 Host,方便上游网关做业务路由和策略匹配
- 避免在 location 内用 rewrite 改写 $uri 做业务分流——那属于路由逻辑,应交给 upstream-gateway 处理
用 Rewrite 辅助安全标准化(非业务路由)
某些安全收口场景下,可用 rewrite 做轻量级请求规整,但仅限于无状态转换:
- 强制 HTTPS:在 80 端口 server 块里用 rewrite 301 跳转(不是收口主逻辑,只是基础防护)
-
清理危险路径:如屏蔽 .git、.env 访问:
rewrite ^/(?:\.git|\.env).*$ /404.html last; -
统一入口路径前缀:若上游要求所有请求带 /v1/,可用
rewrite ^/(.*)$ /v1/$1 break;,但需确认上游是否接受 - 禁止 HTTP 方法:用 if + return 更合适(rewrite 不适合做 method 控制)
关键提醒:Rewrite 不是路由替代品
常见误区是试图用大量 rewrite 规则区分业务线(如把 shop.example.com 的请求 rewrite 成 /shop/xxx),这会导致:
- 配置臃肿难维护,每新增业务都要改 Nginx 配置
- 丢失原始 Host 和路径语义,上游无法精准鉴权或打日志
- 与前端构建的 base URL 冲突(如 Vue Router history 模式)
正确做法是:Nginx 只做协议终止、头信息增强、基础清洗;真正的“按域名分发+安全检查”交给后端网关(如 Nginx + Lua、OpenResty、Kong、Traefik 或自研服务)处理。Nginx 在这里是“统一接入层”,不是“业务路由器”。











