NGINX下仅单个域名出现ERR_CERT_COMMON_NAME_INVALID错误如何解决
问题原因分析
- 你配置的80端口
server块仅匹配example.com的请求,访问http://www.example.com时无法匹配到该块,Nginx不会返回预期的301跳转 - 307状态码是浏览器本地HSTS(HTTP严格传输安全)策略触发的内部重定向,并非Nginx返回:由于你之前的站点返回过带
includeSubDomains参数的HSTS头,浏览器会自动将所有example.com子域名的HTTP请求直接升级为HTTPS请求,根本不会请求80端口 - 升级后的请求是
https://www.example.com,而你的SSL证书仅对example.com签发,SSL握手阶段就会触发ERR_CERT_COMMON_NAME_INVALID错误,还没走到Nginx的跳转逻辑
修复方案
1. 调整80端口配置捕获所有HTTP请求
将原80端口的server块替换为如下配置,匹配所有HTTP请求直接跳转主站,避免域名匹配遗漏:
server { listen 80 default_server; server_name _; return 301 https://example.com$request_uri; }
2. 解决HTTPS证书适配问题
二选一即可:
- 申请SAN多域名SSL证书,将所有你持有的域名(包括
www.example.com、example.pl、example.at等)都加入证书的使用者备用名称列表,替换原有证书即可解决握手错误 - 如果你不想修改证书,可去掉HSTS响应头里的
includeSubDomains参数,同时清除本地浏览器的HSTS缓存,即可避免浏览器自动将www.example.com的请求升级为HTTPS
3. 优化443端口跳转逻辑
你当前配置中的两条if判断可以合并简化,同时建议将303跳转改为301永久跳转,更符合域名跳转的使用场景,对SEO也更友好:
server { listen 443 ssl default_server; # 如果已经更换为多域名SAN证书,可将所有域名添加到server_name列表 server_name example.com; include /etc/nginx/headers/headers.conf; include /etc/nginx/ssl-options/options-ssl-nginx.conf; ssl_dhparam /etc/nginx/ssl-options/ssl-dhparams.pem; access_log /var/log/nginx/data-access.log combined; # 合并跳转逻辑 if ($host != example.com) { return 301 https://example.com$request_uri; } location / { root /usr/share/nginx/html; try_files $uri /blog-build.html; } }
内容的提问来源于stack exchange,提问作者Pepsko
相关产品推荐
相关产品推荐

