Nginx的server_name匹配按优先级而非书写顺序:精确匹配 > 前导通配符 > 尾随通配符 > 正则(首个匹配生效);多域名同行等价于多个精确匹配,推荐空格分隔;不同行为需分server块。

Nginx 的 server_name 指令支持在同一行写多个域名,**顺序无关紧要**,Nginx 不按书写顺序匹配,而是基于精确匹配、通配符匹配、正则匹配的优先级规则来决定使用哪个 server 块。
匹配优先级才是关键
Nginx 选择 server 块时,严格遵循以下优先级(从高到低):
-
精确匹配:如
server_name example.com;—— 完全一致才命中 -
最长的以 * 开头的通配符匹配:如
server_name *.example.com;(注意:只支持前导通配符,www.*.com无效) -
最长的以 * 结尾的通配符匹配:如
server_name www.*; -
正则表达式匹配(按配置文件中出现顺序):以
~或~*开头,多个正则时,**第一个匹配成功的生效**(此时顺序才起作用)
多个域名写在同一行是常规做法
推荐把同属一个站点的多个域名写在一行,用空格分隔,清晰且无性能差异:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
这样写等价于三个独立的精确匹配,Nginx 内部会统一处理,无需担心谁先谁后。
需要区分不同行为?用多个 server 块
如果不同域名要指向不同根目录、重定向或启用不同配置,就该拆成多个 server 块,各自写 server_name:
- 块1:
server_name example.com;→ 返回 301 到www.example.com - 块2:
server_name www.example.com;→ 正常提供服务 - 块3:
server_name ~^shop\.(.+)$;→ 正则捕获子域,单独处理
这时正则块的书写位置会影响匹配结果(因为正则之间按顺序试),但普通域名之间不互相干扰。
小提醒:避免常见陷阱
• 空格和分号不能少:错写成 server_name a.com,b.com;(逗号)会被当做一个域名,不生效
• 默认虚拟主机:没匹配上的请求会落到第一个 listen 相同的 server 块(不是按文件顺序,而是按 Nginx 加载后的“默认候选”逻辑)
• 检查是否生效:改完后运行 nginx -t 验证语法,再 nginx -s reload

















