Nginx多域名部署需区分共用站点与独立站点:共用站点在同一server块中空格分隔多个server_name;独立站点须分设server块,各配独立证书、目录及规则,并配置default_server兜底。

多域名部署时,Nginx 虚拟主机配置核心在于明确“共用一个站点”还是“分属不同站点”——前者用单个 server 块配多个 server_name,后者必须为每个域名(或域名组合)单独写 server 块。选错方式会导致 HTTPS 报错、跳转异常或内容错乱。
同一站点支持多个域名(如 www 和非 www)
适用于内容完全一致的域名变体,比如 example.com 和 www.example.com 展示相同页面:
-
正确写法:在同一
server块中空格分隔所有域名,server_name example.com www.example.com shop.example.com; - 禁止写法:加引号、逗号或换行,Nginx 会把整串当做一个非法域名处理
- 注意 $host 变量:它始终保留用户实际访问的域名,可用于日志标记、条件重定向(如强制跳 www)或动态路径拼接
不同站点对应不同域名(如 site1.com 和 site2.com)
每个域名提供独立内容、目录、证书或规则,必须拆成多个 server 块:
-
每个块独占 server_name:不能把
site1.com和site2.com写在同一个server_name后面 -
listen 指令需严格一致:HTTP 全用
listen 80,HTTPS 全用listen 443 ssl;混用会导致匹配失效 - DNS 或 /etc/hosts 必须生效:域名未解析到服务器 IP,Host 头根本送不到 Nginx,配置再对也无响应
HTTPS 证书必须覆盖全部域名
HTTP 层靠 Host 头路由,但 TLS 握手依赖 SNI——Nginx 只用 server_name 列表里的第一个域名去校验证书 SAN:
- 若证书只含
example.com,而配置是server_name example.com www.example.com;,访问www.example.com就会提示证书不安全 - 申请证书时必须显式包含所有域名:
certbot -d example.com -d www.example.com -d shop.example.com - 泛域名
*.example.com不匹配根域名example.com,需额外加一个server_name example.com;块
未匹配请求必须兜底
用户直接输 IP、Host 头为空或填错域名时,Nginx 默认交给该端口下第一个 server 块——可能暴露测试页或泄露信息:
- HTTP 兜底推荐:
server { listen 80 default_server; server_name _; return 444; } - HTTPS 兜底必须设:
server { listen 443 ssl default_server; server_name _; ssl_certificate ...; return 444; } -
default_server关键字不可省略,否则无法接管未匹配流量











