Nginx配置异常:主域名与通配符域名SSL证书无法同时生效
解决Nginx中主域名与通配符域名SSL配置冲突的问题
问题根源
你的核心问题在于:
- 通配符SSL证书(
*.example.com)默认不包含裸域名example.com,若证书未同时覆盖这两个域名,访问https://example.com会触发SSL错误。 - 多个
server块监听同一443端口且域名配置逻辑重叠,导致Nginx无法正确匹配,抛出conflicting server name警告并忽略其中一个配置。
具体解决步骤
1. 确保SSL证书同时覆盖两个域名
先检查证书是否包含example.com和*.example.com两个SAN条目。若没有,用Certbot重新申请(以Let's Encrypt为例):
certbot certonly --nginx -d example.com -d *.example.com
这条命令会生成同时覆盖裸域名和通配符的证书。
2. 合并主域名与通配符到同一个server块(最优方案)
不要拆分到多个server块,直接在一个块中指定两个域名,避免Nginx的匹配冲突。示例配置:
server { listen 443 ssl; listen [::]:443 ssl; # 同时指定裸域名和通配符域名 server_name example.com *.example.com; # 替换为你的证书实际路径 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 基础SSL安全配置(可选) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 站点核心配置(根据你的实际需求调整) root /var/www/example-site; index index.html index.htm; location / { try_files $uri $uri/ =404; } }
3. 可选:配置裸域名跳转至www子域名
如果你希望example.com自动跳转到www.example.com,直接在上面的server块中添加以下规则即可,无需额外拆分server块:
if ($host = example.com) { return 301 https://www.example.com$request_uri; }
4. 验证配置并重启Nginx
执行配置检查,确保无警告:
nginx -t
如果输出test is successful,重启Nginx生效:
systemctl restart nginx
为什么之前的方法失效?
- 拆分
server块时,Nginx会根据server_name的匹配优先级选择第一个符合条件的块,另一个块的域名配置会被判定为冲突并忽略。 - 若证书仅包含通配符,访问裸域名时Nginx返回的证书不匹配,浏览器直接抛出SSL错误;偶尔跳转是因为浏览器缓存了之前的重定向规则,并非Nginx的稳定配置。
内容的提问来源于stack exchange,提问作者Farrokh Rostami Kia
相关产品推荐
相关产品推荐

