Nginx中配置server_name虚拟主机的关键是用server_name准确声明响应的域名;支持单块绑定多个域名(空格分隔),可通过$host变量差异化处理,HTTPS需SAN证书,应显式设default_server防未匹配域名误响应。

在 Nginx 中配置基础的 server_name 虚拟主机,本质是让一个 server 块响应特定域名的 HTTP 请求。关键不在于写多少个 server 块,而在于每个块里用 server_name 准确声明它“认谁”。
单个 server 块绑定多个域名(最常用)
适合主站 + www 变体、或多个别名指向同一站点的场景。写法简单直接:
- 域名之间必须用空格分隔,不能用逗号、换行或引号包裹
- 示例:
server_name example.com www.example.com demo.example.org; - 只要请求头中的
Host字段匹配其中任意一个,该server块就会处理 - 推荐把常见变体都列全,比如同时写
example.com和www.example.com,避免用户输 www 后 404 或跳转失败
区分不同域名做定向处理
即使多个域名共用同一套文件和配置,你仍可通过内置变量 $host 识别真实访问域名,并做出差异化响应:
- 强制跳转到首选域名:
if ($host != 'example.com') { return 301 https://example.com$request_uri; } - 日志中记录实际域名:
log_format main '$host - $remote_addr ...'; - 响应头中标记来源:
add_header X-Host $host;
HTTPS 场景下必须注意证书兼容性
HTTP 层可以自由绑定多个域名,但 TLS 握手阶段需要证书支持:
- 单域名证书只对一个
server_name有效,其他域名会触发浏览器证书警告 - 必须使用 SAN(Subject Alternative Name)多域名证书,例如用 Certbot 一次性申请:
certbot -d example.com -d www.example.com -d demo.example.org - Nginx 配置中仍只需一组
ssl_certificate和ssl_certificate_key,指向同一对文件即可 - 确保
listen 443 ssl的server块也写了对应的server_name,否则 SNI 协商可能选错配置块
防止未匹配域名意外命中
如果 DNS 把某个未知域名也解析到了这台服务器,而你又没显式定义兜底规则,Nginx 默认会把请求交给第一个 listen 80 的 server 块处理:
- 建议明确设置一个
default_server,例如:listen 80 default_server; - 这个块可以返回 444(直接关闭连接),或 404,或跳转到主站,避免暴露内部结构
- 不要依赖配置顺序来控制默认行为,要用
default_server显式声明


















