多域名绑定同一端口不冲突,关键在于为每个域名独立配置HTTPS server块并指定对应证书;错误做法是共用server_name和证书;需确保SNI生效、避免默认server接管、80端口也应按域名隔离重定向。

多域名绑定到同一端口(如443或80)本身不是冲突,而是Nginx的正常能力;所谓“冲突”实际是配置不当导致的证书错配、请求误转发或默认server接管等问题。核心在于让Nginx能准确识别每个域名,并为其提供对应的服务和证书。
每个域名必须独立定义 server 块
不能把多个 server_name 堆在一个 HTTPS server 块里共用一套证书——这样 Nginx 会按顺序 fallback 到第一个匹配项,造成证书不匹配或内容错乱。
- ✅ 正确做法:为 site-a.com 和 site-b.com 各写一个
server { listen 443 ssl; server_name site-a.com; ... }和server { listen 443 ssl; server_name site-b.com; ... } - ❌ 错误做法:
server { listen 443 ssl; server_name site-a.com site-b.com; ssl_certificate a.crt; ... }——这会让两个域名共用 a.crt,访问 site-b.com 时浏览器报证书无效
确保 SNI 生效且证书精准绑定
Nginx 默认启用 SNI,但前提是每个 HTTPS server 块都显式声明 listen 443 ssl,并各自指定 ssl_certificate 和 ssl_certificate_key 路径。
- 通配符证书(如
*.example.com)适用于同主域下的子域名,需 DNS 验证 - SAN 证书(Subject Alternative Name)可包含多个不同主域(如 site-a.com、site-b.net),适合跨域场景,支持 HTTP 或 DNS 验证
- Let’s Encrypt 可一次性签发多域名证书:
certbot certonly --nginx -d site-a.com -d site-b.com -d www.site-b.com
避免默认 server 接管未匹配域名
当请求的 Host 头不匹配任何 server_name,Nginx 会交给该端口下定义的第一个 server 块处理——如果它绑的是 site-b.com 的证书,那所有未配置的域名访问都会触发证书警告。
- 显式设置一个兜底 server 块,监听相同端口但不启用 SSL,返回 444 或 404,防止误响应:
server { listen 443; server_name _; return 444; } - 或在首个 server 块中加
default_server标志,明确其为默认行为,便于排查
HTTP 端口(80)也要做对应隔离
即使只走 HTTPS,也建议为每个域名单独配置 80 端口的重定向 server 块,避免因 Host 匹配失败而跳转错误。
- 例如:
server { listen 80; server_name site-a.com; return 301 https://$host$request_uri; } - 不要写成:
server { listen 80; server_name _; return 301 https://site-a.com$request_uri; }——这会把所有未定义域名强制跳到 site-a.com


















