<p>Nginx 中 server_name 支持以 ~ 或 ~* 开头的 PCRE 正则表达式匹配多域名,需用 ^$ 锚定、转义点号,按配置顺序匹配;优先级为精确匹配 > 通配符前缀 > 正则匹配。</p>

在 Nginx 中,server_name 指令本身不支持直接用正则表达式匹配多个域名(比如 ~^(www\.)?example\.(com|org)$),但可以通过 正则表达式 server_name 的方式实现多域名灵活匹配——关键在于:必须以 ~ 开头,且整个值是一个合法的 PCRE 正则表达式。
使用带 ~ 前缀的正则表达式
Nginx 允许用 ~(区分大小写)或 ~*(不区分大小写)引导一个正则表达式作为 server_name 的值。它会按顺序匹配请求头中的 Host 字段。
- 写法示例(匹配
example.com、www.example.com、example.org、www.example.org):
server_name ~^(www\.)?example\.(com|org)$;
-
^和$很重要,防止部分匹配(如避免myexample.com被误中) - 括号需转义为
\.,否则.表示任意字符 - 多个可选后缀用
(com|org)分组,竖线|表示“或”
匹配带子域名的泛用模式
若想匹配任意一级子域名(如 api.example.com、blog.example.com,但不包括 dev.api.example.com),可用:
server_name ~^([a-z0-9\-]+)\.example\.com$;
-
[a-z0-9\-]+匹配小写字母、数字和短横线组成的子域名 - 捕获组
()可在后续用$1引用(例如重定向或日志中) - 注意:Nginx 不支持在
server_name中直接使用$1做变量替换,仅可用于rewrite或return等上下文
同时支持正则与字面量,按优先级匹配
Nginx 对 server_name 的匹配有明确优先级(从高到低):
- 精确匹配(
server_name example.com;) - 最长前缀匹配(
server_name *.example.com;) - 正则匹配(
server_name ~^.*\.example\.com$;)——按配置文件中出现顺序
因此,如果既想保留某个固定域名的高效匹配,又想兜底其他变体,可这样组织:
server_name example.com; server_name ~^([a-z0-9\-]+)\.example\.com$;
此时 example.com 由第一条快速命中;api.example.com 则交给第二条正则处理。
调试与验证技巧
正则容易出错,建议:
- 用
nginx -t检查语法是否合法(错误会提示 “invalid number of arguments in server_name” 或类似) - 开启
error_log /path/to/log warn;,Nginx 在正则编译失败时会在 warn 级别报错 - 临时加一条
return 200 "matched: $host\n";配合curl -H "Host: xxx" 127.0.0.1快速验证


















