Nginx server_name匹配优先级为精确匹配>通配符>正则表达式;通配符仅限开头或结尾,如.example.com;正则需以~或~*开头,支持捕获组引用;建议按优先级顺序配置并用nginx -t和curl验证。

Nginx 的 server_name 指令支持通配符和正则表达式,是实现单服务响应多个域名的核心机制。关键在于理解匹配优先级:精确匹配 > 通配符(前缀或后缀)> 正则表达式,且正则需以 ~ 或 ~* 开头(后者忽略大小写)。
通配符匹配:简洁覆盖子域名场景
适用于固定结构的子域名分发,如所有 *.example.com 都指向同一站点。
- 用
*匹配单个域名段,只能出现在开头或结尾,不能在中间(www.*.com无效) -
server_name *.example.com;匹配blog.example.com、api.example.com,但不匹配example.com或sub.blog.example.com -
server_name www.example.*;匹配www.example.org、www.example.net,适合多 TLD 站点
正则表达式匹配:应对复杂命名规则
当域名规律不统一(如含数字、下划线、多级可变子域)时,正则更灵活。
- 必须以
~(区分大小写)或~*(不区分)引导,例如:server_name ~^([a-z0-9]+)\.example\.com$; - 捕获组内容可通过
$1在后续指令中引用,比如重写路径:rewrite ^/(.*)$ /site/$1?domain=$1 break; - 避免过度使用:正则匹配性能低于通配符,且配置错误易导致 404;建议先用
nginx -t测试语法
混合使用与优先级控制技巧
一个 server 块可同时定义多种 server_name,Nginx 按规则顺序选择最优匹配。
- 把最具体的放前面:先写
example.com,再写*.example.com,最后写正则,防止通配符“吃掉”本该走正则的请求 - 用正则兜底:例如
server_name ~^(?<sub>.+)\.example\.com$;</sub>+if ($sub = "www") { return 301 https://example.com$request_uri; }实现 www 跳转 - 注意空主机头:若需响应无
Host头的请求,加server_name "";
调试与验证要点
匹配行为不易直观观察,需结合日志与工具确认实际路由。
- 开启
error_log /path/to/log notice;,Nginx 在notice级别会记录匹配到的server_name - 用
curl -H "Host: test.example.com" http://your-ip/模拟不同 Host 请求,验证是否进入预期 server 块 - 检查
nginx -T(显示完整生效配置)确认 server_name 是否被正确加载,避免拼写或分号遗漏

















