Nginx反向代理中基于域名的正则匹配与跳转需用server_name配合~*正则,结合map映射或return/rewrite实现动态代理或301跳转,并注意转义、优先级及调试验证。

要实现 Nginx 反向代理中基于域名的正则匹配与通用跳转,核心是使用 server_name 指令配合正则表达式,并结合 rewrite 或 return 实现动态跳转逻辑。
支持通配符和正则的 server_name 配置
Nginx 的 server_name 支持精确匹配、通配符(*)和 PCRE 正则(以 ~ 开头)。若需按域名前缀/后缀/子串灵活跳转,必须用正则写法:
- 以
~开头表示区分大小写的正则匹配(如~ ^app\..*) - 以
~*开头表示不区分大小写(推荐用于域名场景) - 正则中可捕获组(如
(.*)),后续在rewrite或变量中引用(如$1)
将匹配到的域名动态映射到后端服务
常见需求是:访问 api-v1.example.com → 代理到 http://backend-v1/;api-v2.example.com → http://backend-v2/。可通过 map 指令预定义映射关系,再在 proxy_pass 中引用:
map $host $backend_upstream {
~^api-(?<version>v\d+)\.example\.com$ backend-$version;
~^admin\.example\.com$ backend-admin;
default backend-default;
}
server {
listen 80;
server_name ~^[a-zA-Z0-9.-]+\.example\.com$;
location / {
proxy_pass http://$backend_upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
域名匹配后执行 301/302 跳转(非代理)
若目标是“跳转”而非代理(例如统一重定向旧域名),直接用 return 或 rewrite ... redirect:
-
return 301 https://new.example.com$request_uri;—— 简洁高效,推荐用于固定跳转 -
rewrite ^(.*)$ https://$1.newdomain.com$request_uri? permanent;—— 适合需改写域名结构的场景(注意$1来自server_name正则捕获) - 确保
server_name正则已捕获关键部分,例如:server_name ~^(?<sub>.*?)-old\.example\.com$;</sub>,然后跳转到https://$sub-new.example.com$request_uri
注意事项与调试技巧
正则匹配易出错,上线前务必验证:
- 使用
nginx -t检查语法;用nginx -T输出完整生效配置,确认server_name是否被正确加载 - 域名正则中点号
.必须转义为\.,否则匹配任意字符 - 避免正则过于宽泛(如
~.*)导致覆盖其他server块;Nginx 优先级:精确 > 通配符 > 正则,多个正则按配置顺序匹配第一个成功项 - 测试时用
curl -H "Host: test.example.com" http://127.0.0.1模拟特定域名请求,绕过 DNS


















