全站 https 后第三方 http 资源被浏览器混合内容机制拦截;需统一改为协议相对(//)或 https 地址,辅以 apache 响应替换、https 可用性验证及 csp 策略管控。

全站开启 HTTPS 后,第三方外链资源(如 CDN 的 JS、字体、图片、统计脚本等)加载失败,根本原因是浏览器的混合内容(Mixed Content)拦截机制——当主页面是 HTTPS,但资源请求仍用 HTTP 协议时,现代浏览器(Chrome、Firefox、Safari)默认阻止加载,控制台报 Mixed Content: The page at 'https://...' was loaded over HTTPS, but requested an insecure resource 'http://cdn.example.com/xxx.js'。
检查并统一资源协议引用方式
前端 HTML、CSS、JS 中硬编码的 http:// 外链必须改为协议相对(//cdn.example.com/xxx.js)或强制 HTTPS(https://cdn.example.com/xxx.js):
- 协议相对地址(
//)最常用:它会自动继承当前页面协议,HTTPS 页面下自动走 HTTPS,开发调试用 HTTP 时也不出错 - 避免使用
http://显式写法,哪怕 CDN 声称支持 HTTP;部分 CDN(如某些旧版 BootstrapCDN)已停用 HTTP 端口 - 若使用构建工具(Webpack/Vite),检查
public/中静态资源路径、index.html内联 script/src、CSS @import 是否含死链
配置 Apache 强制重写 HTTP 外链为 HTTPS(辅助兜底)
对无法修改源码的遗留系统或 CMS(如老版本 WordPress 插件生成的 HTTP 链接),可在 Apache HTTPS 虚拟主机中启用 mod_substitute 模块做响应体替换:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 确认模块已启用:
a2enmod substitute(Debian/Ubuntu)或在httpd.conf中取消LoadModule substitute_module modules/mod_substitute.so注释 - 在
<virtualhost></virtualhost>内添加:AddOutputFilterByType SUBSTITUTE text/html Substitute "s|http://cdn\.example\.com|https://cdn.example.com|ni" Substitute "s|src=\"http://|src=\"https://|i" Substitute "s|href=\"http://|href=\"https://|i" - 注意:仅适用于文本型响应(HTML/CSS/JS),不处理二进制资源;正则需严格匹配,避免误改其他内容
验证第三方服务是否真正支持 HTTPS
不是所有标称“支持 HTTPS”的 CDN 或服务都实际提供有效证书或兼容 TLS 版本:
- 用
curl -I https://cdn.example.com/resource.js检查返回状态码是否为 200,且无证书错误 - 用
openssl s_client -connect cdn.example.com:443 -servername cdn.example.com 2>/dev/null | openssl x509 -noout -dates查看证书有效期和域名匹配 - 特别注意:部分免费 CDN(如某些国内小厂)仅对一级域名配证书,子域名(
static.cdn.com)可能证书不匹配,导致 Chrome 直接拒绝连接
启用 Content Security Policy(CSP)主动管控
通过响应头明确声明允许加载的外部资源域,既能防混合内容,也能提升安全性:
- 在 HTTPS 虚拟主机中添加:
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.example.com https://stats.example.com; img-src 'self' https: data:; font-src 'self' https://fonts.googleapis.com;" - 先用
Content-Security-Policy-Report-Only测试策略,配合report-uri收集违规日志,再切到强制模式 - 避免宽泛设置
script-src *或img-src http:,否则等于放弃防护










