Nginx 的 server_name 原生支持空格分隔多个域名,按精确匹配→左端通配符→正则匹配优先级择优;HTTPS 需 SAN 证书覆盖全部域名;可用 $host 变量实现重定向、日志区分等差异化处理。

在 Nginx 中,server_name 指令本身就支持配置多个备用域名,只需用**空格分隔**,写在同一行即可。这不是“扩展技巧”,而是原生能力,不需要额外模块或嵌套逻辑。
正确写法:空格分隔,一行搞定
直接在 server_name 后面列出所有要响应的域名,中间只用空格,不能加逗号、引号或换行:
server_name example.com www.example.com demo.example.org blog.example.net;- 这样访问任意一个域名,只要 DNS 解析到这台服务器,且 HTTP 请求头中的
Host字段匹配其中任一值,就会由这个server块处理 - 注意结尾的分号不能省略
匹配优先级决定谁先被选中
Nginx 不是随机匹配,而是按明确顺序择优:
- 先找完全一致的精确匹配(如
example.com) - 再找左端通配符(如
*.example.com),只支持开头带* - 最后才尝试正则匹配(如
~^www\d+\.example\.com$) - 如果多个
server块都可能匹配,Nginx 会按上述规则选出最具体的那个
HTTPS 下必须用 SAN 证书覆盖全部域名
HTTP 层的多域名没问题,但 HTTPS 有额外约束:
- TLS 握手阶段依赖 SNI,Nginx 只用第一个域名(如
example.com)去加载证书 - 所以证书必须包含所有备用域名,即使用 SAN(Subject Alternative Name)证书
- 申请时要一次性指定全部域名,例如:
certbot -d example.com -d www.example.com -d demo.example.org - 否则浏览器会提示证书不匹配,即使
server_name配置正确也打不开
用 $host 区分不同域名的行为
虽然共用一个 server 块,但你可以通过内置变量 $host 做差异化处理:
- 重定向特定域名:
if ($host = "www.example.com") { return 301 https://example.com$request_uri; } - 记录不同域名访问日志:
log_format by_host '$host $remote_addr – $request'; - 动态设置根目录(需配合
map指令,不建议在server块内直接用if改root)


















