Nginx可通过正则捕获子域名并动态proxy_pass实现二级域名自动转发:用~^(?<subdomain>1+).example.com$匹配并提取$subdomain,再拼入https://$subdomain.backend.internal/;泛域名*.example.com仅静态匹配,不支持变量提取。. ↩

用正则捕获子域名并动态转发
在 `server` 块中用带命名捕获组的正则匹配 `server_name`,把子域名存进变量,然后在 `proxy_pass` 中直接引用:
- 写法示例:
server { listen 80; server_name ~^(?<subdomain>[^.]+)\.example\.com$; location / { proxy_pass https://$subdomain.backend.internal/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } } - `~^` 表示启用正则匹配;`(?
[^.]+)` 捕获第一个点前的所有非点字符(即子域名),之后 `$subdomain` 就能在 `proxy_pass` 等指令中直接使用 - 确保 DNS 已将 `*.example.com` 解析到这台 Nginx 的 IP,否则请求根本到不了
泛域名通配符仅作兜底或静态转发
如果所有二级域名都指向同一个后端(比如 SaaS 多租户统一入口),不需要提取变量,那用通配符更简洁:
- 写法:
server_name *.example.com;—— 匹配a.example.com、test.example.com,但不匹配example.com(主域)或a.b.example.com(三级域) - 此时 `proxy_pass` 可以写死,例如
proxy_pass http://shared-backend;,无需变量参与 - 注意匹配优先级:Nginx 先试精确匹配(如
www.example.com),再试*.example.com,最后才轮到正则;所以泛匹配的 `server` 块建议放在具体域名配置之后,避免被覆盖
HTTPS 场景必须补全 resolver 和 SSL 设置
当 `proxy_pass` 目标是域名(而非 IP)且走 HTTPS,Nginx 默认无法解析域名或校验证书,容易返回 502:
- 在 `http` 块顶部加 DNS 解析器:
resolver 144.144.144.144 valid=30s; - 开启 SNI 支持:
proxy_ssl_server_name on;,让后端能根据域名返回正确证书 - 若后端用自签名或私有 CA 证书(仅限内网可信环境),还需加:
proxy_ssl_verify off;
路径与请求头必须规范设置
动态转发时,路径继承和头信息透传极易出错,务必按规处理:
- `proxy_pass` 末尾是否带
/决定路径拼接逻辑:`https://$subdomain.backend.internal/`(结尾有斜杠)会把原始 URI 路径完整带过去;若没斜杠,则可能截断或重复 - 必须显式透传关键头:
Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto,否则后端可能无法识别来源或生成错误跳转链接 - 建议搭配 `upstream` 使用,便于做健康检查和故障转移,而不是硬写域名在 `proxy_pass` 里


















