nginx的server_name支持正则匹配,需以~(区分大小写)或~*(不区分大小写)开头;捕获组可在return、rewrite等指令中引用;正则匹配优先级低于精确和通配符匹配,按配置顺序生效。

Nginx 的 server_name 指令支持正则表达式匹配,但需以波浪号 ~ 开头(区分大小写)或 ~* 开头(不区分大小写),才能启用正则匹配功能。
正则匹配的基本写法
必须用 ~ 或 ~* 显式声明,否则 Nginx 会按字面量或通配符(*)方式处理,不会执行正则引擎。
-
server_name ~^www\.(.+)$;—— 匹配以www.开头的域名,并捕获主域名部分(如www.example.com中的example.com) -
server_name ~*^blog\.(.*)$;—— 不区分大小写匹配blog.开头的任意域名(如BLOG.EXAMPLE.ORG也匹配) -
server_name ~^(?<subdomain>[a-z0-9\-]+)\.example\.com$;</subdomain>—— 使用命名捕获组,后续可在location或return中通过$subdomain引用
捕获变量的使用场景
正则中定义的捕获组(普通或命名)会在当前 server 块内生成变量,可被 return、rewrite、set 等指令直接引用。
-
return 301 https://$1$request_uri;—— 配合~^www\.(.+)$,将www.example.com重定向到example.com -
set $env "prod";+if ($subdomain = "staging") { set $env "staging"; }—— 结合命名捕获做环境判断(注意:if 在 location 外慎用)
注意事项与常见陷阱
正则匹配发生在 server 块选择阶段,优先级低于精确匹配和通配符匹配,但高于泛域名 *。多个正则 server_name 共存时,Nginx 按配置文件中出现顺序依次尝试,第一个匹配成功的即生效。
- 点号
.、括号()、加号+等需反斜杠转义,否则会被当作正则元字符处理 - 避免过度复杂的正则,影响性能;简单需求优先用通配符(如
server_name *.example.com;) - 测试正则是否生效,可用
nginx -t检查语法,再用curl -H "Host: test.example.com" http://localhost验证路由结果
实际配置示例
以下配置实现:所有子域名统一跳转到对应二级域名的 HTTPS 站点,并保留路径:
server {
listen 80;
server_name ~^(?<sub>.+)\.example\.com$;
return 301 https://$sub.example.com$request_uri;
}</sub>
注意:该 server 块仅响应 Host 头为 xxx.example.com 的请求,且 $sub 可安全用于重定向地址中。











