从 HTTP 升级到 HTTPS CDN 配置需要注意哪些兼容性?

文章导读
升级 HTTPS 不仅是 CDN 上挂证书,核心在于回源协议匹配和全站资源加密,否则容易出现 502 错误或混合内容警告。
📋 目录
  1. 证书与 CDN 基础配置
  2. 回源协议与源站适配
  3. 前端混合内容处理
  4. 源站 Nginx 例外配置
  5. 验证与排查
A A

升级 HTTPS 不仅是 CDN 上挂证书,核心在于回源协议匹配和全站资源加密,否则容易出现 502 错误或混合内容警告。

先说结论:CDN 侧必须配置有效证书,回源协议需根据源站能力选择 HTTP 或 HTTPS,同时需解决前端混合内容问题。

  • 适合:全站启用 HTTPS 加密传输,且源站支持或可配置相应协议的场景。
  • 先准备:确认源站端口(80 或 443)、证书格式(PEM)及域名匹配情况,私钥支持 RSA 或 ECC。
  • 验收:检查浏览器安全面板无混合内容警告,且回源链路无 301 循环或 502 错误。

证书与 CDN 基础配置

在 CDN 控制台上传证书,确保证书域名与加速域名匹配。若使用通配符证书,需确认覆盖所有二级域名。

  • 证书格式:通常要求为 PEM 格式,私钥支持 RSA 或 ECC 格式,根据安全需求选择,若为其他格式需先转换。
  • HTTPS 开关:在 CDN 域名管理中找到 HTTPS 配置,开启强制 HTTPS 跳转。
  • HTTP/2 支持:建议同时开启 HTTP/2 以提升加载性能,兼容主流浏览器。

回源协议与源站适配

登录 CDN 控制台检查回源配置,避免协议不匹配导致连接失败:

  • 源站支持 HTTPS:回源端口设为 443,协议选 HTTPS,并确保源站开放 443 端口且证书有效。
  • 源站仅支持 HTTP:回源端口设为 80,协议选 HTTP,避免 CDN 以 HTTPS 请求源站导致连接失败。
  • SNI 配置:当源站 IP 绑定多个域名时,需在 CDN 开启回源 SNI 并指明具体域名,否则可能返回 503 错误。

前端混合内容处理

检查页面内的脚本、样式、图片及 Ajax 请求。浏览器安全策略会阻止 HTTPS 页面加载 HTTP 资源。

从 HTTP 升级到 HTTPS CDN 配置需要注意哪些兼容性?

错误示例:

<script src="http://example.com/lib.js"></script>

修正方案:改为 https:// 或协议相对路径 //。

<script src="//example.com/lib.js"></script>

对于动态构建的资源路径,建议通过环境变量管理 API 基础 URL,避免硬编码协议。

从 HTTP 升级到 HTTPS CDN 配置需要注意哪些兼容性?

源站 Nginx 例外配置

部分老旧第三方服务可能仅支持 HTTP,但主流平台如微信已强制要求 HTTPS 回调。若源站需保留特定 HTTP 接口,可在 Nginx 中配置例外,避免全站 301 跳转导致回调失败。

server {
    listen 80;
    server_name example.com;

    # 特定路径保留 HTTP,其他强制跳转 HTTPS
    location /api/legacy_http {
        # 不执行 return 301
        proxy_pass http://backend;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

验证与排查

1. 浏览器安全面板

打开 Chrome 开发者工具的 Security 面板,查看是否存在 Mixed Content 警告。若显示“连接是安全的”,则前端资源加载正常。

2. 命令行测试

从 HTTP 升级到 HTTPS CDN 配置需要注意哪些兼容性?

使用 curl 命令测试回源链路是否正常,观察状态码:

curl -I https://你的域名

若返回 200 OK 且无多次 301 跳转,说明链路通畅。若出现 502 或 503,需检查源站端口及 SNI 配置。

3. 常见错误排查

  • 301 重定向循环:CDN 强制 HTTPS 跳转,但源站 HTTP 请求也返回 301 到 HTTPS,导致请求在两者间无限循环,最终报 502 错误。
  • 证书域名不匹配:购买的证书仅适用于主域名,但加速域名为二级域名,导致浏览器报证书无效错误。
  • SSL 版本不匹配:源站或 CDN 配置的 SSL 版本过低或加密套件不受支持,导致 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 错误。