宝塔面板SSL后www与裸域只生效一个:证书覆盖与server_name分流

    发布时间:2026-09-21 12:32 更新时间:2026-09-21 12:32 阅读量:0

    在宝塔面板里给站点申请并部署 SSL 之后,很多站长会遇到一个很典型的现象:浏览器访问 https://www.example.com 正常,换成 https://example.com 就报证书错误或连接被重置;反过来也有可能。HTTP 下两个入口都能打开,一上 HTTPS 就只剩一个能用,问题基本出在两处:证书本身覆盖了哪些域名,以及 Nginx 的 server_name 有没有把两个入口都接住。

    把这两件事理清楚,你就能判断是重新签证书、补一条站点,还是只改一段跳转配置。下面按证书范围和服务器分流两个层面拆开讲。

    先分清证书的域名覆盖范围

    证书不是「给一台服务器签的」,而是「给一组域名签的」。浏览器校验的是:你访问的域名,是否出现在证书的域名列表里。因此判断问题第一步,是看证书到底包含哪些名字。

    单域名证书只写一个名字,例如只签了 example.com。这时访问 www.example.com,浏览器发现证书里没有 www 这个名字,就会拦下来。多域名证书(SAN 证书)在同一张证书里列出多个名字,可以同时包含 example.com 和 www.example.com;通配符证书 *.example.com 只能覆盖同一级子域,注意它通常不覆盖裸域本身,裸域要单独加进去。

    在宝塔面板里,进入「网站 → 对应站点 → SSL」,证书信息区域一般能看到证书包含的域名列表。也可以用命令行直接读服务器上已部署的证书文件,确认它签了哪些名字:

    # 查看证书包含的域名(SAN 列表)
    openssl x509 -in /www/server/panel/vhost/cert/example.com/fullchain.pem -noout -text | grep -A1 "Subject Alternative Name"
    
    

    只看颁发对象与有效期

    openssl x509 -in /www/server/panel/vhost/cert/example.com/fullchain.pem -noout -subject -dates

    如果输出的 DNS 列表里没有你访问的那个域名,那就不是配置问题,而是证书没覆盖到,需要重新申请一张把两个名字都包含进去的证书。宝塔面板申请 Let's Encrypt 证书时,勾选域名的地方通常可以把 www 和裸域一起勾上,具体界面以你当前面板版本为准。

    server_name 与跳转:让两个入口都接住

    证书覆盖到位之后,还要保证 Nginx 对两个域名的请求都能正确响应。Nginx 是按 server_name 匹配请求 Host 的,谁匹配上就用谁的配置。常见做法有两种。

    第一种,一个站点文件里同时写两个 server_name,证书也挂在同一段里。这样两个域名共用同一份配置和同一张证书,适合两个入口内容完全一致的情况:

    server {
        listen 443 ssl http2;
        server_name example.com www.example.com;
    
        ssl_certificate     /www/server/panel/vhost/cert/example.com/fullchain.pem;
        ssl_certificate_key /www/server/panel/vhost/cert/example.com/privkey.pem;
    
        root /www/wwwroot/example.com;
        index index.php index.html;
    }
    
    

    80 端口统一跳到 HTTPS

    server { listen 80; server_name example.com www.example.com; return 301 https://www.example.com$request_uri; }

    第二种,在宝塔里建两个站点分别绑定裸域和 www,各自部署证书。这种结构更清晰,但要注意两个站点的根目录、伪静态、PHP 版本要一致,否则会出现「一个入口是网站、另一个入口是默认页」的串站现象。无论哪种方式,判断当前请求落到哪个 server 块,可以看访问日志里的 server 名字段,或者用 curl 指定 Host 直接测:

    # 分别用两个域名测试 TLS 握手与响应头
    curl -I https://example.com
    curl -I https://www.example.com
    
    

    忽略证书问题只看服务端返回,用于区分是证书报错还是配置报错

    curl -k -I https://www.example.com

    如果 curl -k 能通、不带 -k 就报证书错误,说明服务端配置没问题,问题在证书没覆盖该域名;如果带不带 -k 都连不上或返回错误页,就要往 server_name 匹配和站点绑定上查。

    避坑要点与收尾检查

    第一,别只改跳转不补证书。有人把 80 端口强制跳到 www,以为访问裸域会自动过去,但用户如果直接输入 https://example.com,浏览器在发起请求前就要先完成 TLS 握手,此时还没轮到跳转规则,证书不匹配照样报错。跳转只能解决 HTTP 入口,HTTPS 入口必须靠证书覆盖。

    第二,两条入口都启用 HTTPS 后,建议统一主域并做 301,避免 www 与裸域各自被收录造成权重分散。选哪个当主域没有硬性规定,选定后让另一个稳定跳过去即可,跳转链尽量一步到位,别 www 跳裸域再跳 www。

    第三,改完配置记得检查语法并重载,不要直接重启:

    nginx -t && nginx -s reload
    

    宝塔面板环境下重载

    /etc/init.d/nginx reload

    另外,如果站点前面套了 CDN,CDN 侧一般也要单独上传或引用证书,并配置回源协议与回源 Host,否则源站通了、边缘节点仍可能报证书错误,这部分以各 CDN 服务商文档为准。证书自动续期后如果新证书没覆盖全部域名,续期成功也可能再次出现只生效一个的情况,续期后值得用上面的 openssl 命令复查一次 SAN 列表。

    总结一下排查顺序:先用 openssl 看证书包里有没有两个域名,没有就重新申请覆盖两个名字的证书;再看 Nginx 的 server_name 是否两个都接住、443 与 80 是否都有对应 server 块;最后统一主域做 301,并确认 CDN 与续期环节没有漏掉域名。按这个顺序走,www 与裸域同时走 HTTPS 通常一次就能配好。

    继续阅读

    📑 📅
    服务器买多大够用:按日均PV估算CPU内存带宽 2026-09-21
    域名转入转出实操:转移码、60天锁与DNS不断线 2026-09-21
    宝塔面板新建站点访问却是默认页:根目录与index排查 2026-09-21
    WordPress换主题后排版错乱:数据迁移避坑指南 2026-09-21
    建站前期最容易踩的域名坑:泛解析、www并存与CNAME冲突 2026-09-21
    Nginx 静态资源 304 与 200 反复切换:条件请求排查 2026-09-22
    宝塔面板开CDN后日志全是节点IP:real_ip落地配置 2026-09-22
    WordPress数据库utf8转utf8mb4:emoji问号的处理步骤 2026-09-22
    服务器只开80/443:SSH端口转发访问面板与数据库 2026-09-22
    换服务器后百度收录掉了:改IP前后的抓取诊断与sitemap动作 2026-09-22