关键是要用一个server块承载所有域名并配san或泛域名证书;需在server_name中空格列出全部域名,指定同一ssl_certificate路径,配置ssl_protocols、hsts等安全项,并另设80端口server块做301跳转。

要让多个域名共用同一张 SSL 证书,关键不是写多个 server 块,而是用一个 server 块承载所有域名,并确保证书本身支持它们——也就是必须用 SAN 证书或泛域名证书。
确认证书类型是否匹配需求
单域名证书(如只含 example.com)无法用于其他域名,浏览器会直接报错。可用的两类合规证书是:
-
SAN 证书:在一张证书里明确列出全部域名,例如
example.com、www.example.com、api.example.com -
泛域名证书:如
*.example.com,能匹配所有一级子域;但注意它不包含裸域example.com,需额外在 SAN 字段中补上
在一个 server 块中声明全部域名
不需要为每个域名单独建 server 块。只需一个 HTTPS 的 server,把所有目标域名用空格分隔写进 server_name:
-
listen 443 ssl http2;—— 必须带ssl参数 server_name example.com www.example.com shop.example.com;ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
补充必要安全与兼容配置
仅配证书和域名还不够,生产环境还需这些基础项:
-
ssl_protocols TLSv1.2 TLSv1.3;—— 禁用老旧协议 -
ssl_ciphers推荐使用现代强加密套件(如 ECDHE 开头的组合) -
ssl_session_cache shared:SSL:10m;和ssl_session_timeout 10m;—— 启用会话复用 -
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;—— 强制 HSTS
HTTP 请求统一跳转到 HTTPS
另起一个监听 80 端口的 server 块,对所有绑定域名做 301 跳转:
listen 80;server_name example.com www.example.com shop.example.com;return 301 https://$host$request_uri;
只要证书覆盖完整、server_name 列全、路径无误,Nginx 就能靠 SNI 正确分发同一份证书给所有域名,无需额外逻辑。











