一聚教程网:一个值得你收藏的教程网站

热门教程

Nginx 中 Server 配置如何设置 server_name 匹配多个域名与泛域名

时间:2026-08-24 11:32:48 编辑:袖梨 来源:一聚教程网

Nginx 的 server 块可通过 server_name 指令用空格分隔多个域名、单侧通配符(如 *.example.com)或正则(以 ~ 开头)实现多域名响应,但需确保 DNS 解析正确、Host 头匹配,并使用覆盖全部域名的 SAN 或泛域名证书。

在 Nginx 中,一个 server 块支持同时响应多个域名,关键就在 server_name 指令的写法——不是靠堆砌多个 server 块,而是用空格把域名列在一起,并合理使用通配符或正则。

多个精确域名直接空格分隔

这是最常用也最稳妥的方式。所有要指向同一站点的域名,写在同一行,中间只用空格隔开,不能加逗号、引号或换行:

  1. server_name example.com www.example.com demo.site app.demo.site;
  2. DNS 必须将这些域名都解析到这台服务器 IP
  3. 客户端请求中的 Host 头必须与其中任一完全匹配(大小写不敏感)
  4. 如果配置文件里只有这一个 server 块,Nginx 会默认命中它,不管 Host 是什么

泛域名匹配有明确限制

Nginx 只允许单侧通配符,且只能出现在最左或最右,不能嵌套、不能多处出现:

  1. ✅ 合法:*.example.com(匹配 www.example.comapi.example.com
  2. ✅ 合法:example.*(匹配 example.comexample.cn
  3. ❌ 非法:www.*.com*.example.*www..com
  4. 推荐组合写法:example.com *.example.com,兼顾主域和所有子域

正则匹配更灵活但需注意顺序

~ 开头表示正则,可用于动态提取域名或统一处理多级结构:

  1. server_name ~^(www.)?(.+)$; —— 匹配任意带或不带 www 的域名,捕获主域名到 $2
  2. server_name ~^([a-z0-9-]+).example.com$; —— 匹配所有合法二级子域
  3. 正则匹配优先级最低,只有在精确匹配和通配符都不中时才启用
  4. 正则表达式一旦启用,务必用 nginx -t 测试语法,避免配置加载失败

HTTPS 场景下必须考虑证书覆盖

多个域名共用一个 server 块时,SSL/TLS 证书必须能覆盖全部域名:

  1. 用 SAN(Subject Alternative Name)证书,把所有域名都列进证书里
  2. 或用泛域名证书,比如 *.example.com,但注意它不包含 example.com 主域(除非显式加入)
  3. 不要指望 example.com 的证书能自动保护 blog.example.com

热门栏目