很多运维、站长把 SSL 部署等同于“上传证书、配置监听、完成 301 跳转”,证书检测全部通过,打开首页锁标正常,就宣告 HTTPS 改造完成。可上线一段时间,内页、商品页、后台、移动端页面时不时冒出不安全警告,样式错乱、接口偶尔失效,排查半天证书本身毫无问题——这就是混合内容(Mixed Content),SSL 落地里最容易漏掉、也最容易低估风险的一环。
一、到底什么是混合内容
一句话定义:主页面通过 HTTPS 加密加载,但页面内部引用的子资源,依然使用明文 HTTP 请求,就构成混合内容。主文档加密,子资源明文,整条安全链路直接破防。
浏览器把混合内容分成两类,风险和处理逻辑完全不一样:
- 主动混合内容(高危) 脚本、CSS、iframe、AJAX、Fetch、字体、接口请求。现代浏览器默认直接拦截。表现为页面样式崩、交互失效、支付弹窗出不来、统计代码不运行。攻击者篡改这段 JS,就可以在你的站点上下文里窃取 Cookie、劫持表单、跳转钓鱼。
- 被动混合内容(展示类) 图片、视频、音频。早期浏览器放行,仅去掉安全锁标;新版浏览器也逐步自动升级或拦截。风险看似低,但图片、二维码、商品图可以被中间人替换,误导用户。
很多坑的特点是“首页正常,内页翻车”:首页静态资源全换成 HTTPS,但文章、老上传附件、第三方插件、广告、地图组件里硬写死的 http 地址,藏在数据库、富文本、插件配置里,静态扫描很容易漏掉。
二、为什么它是 SSL 部署盲区
绝大多数人做 HTTPS,注意力集中在证书本身:域名匹配、证书链、有效期、OCSP、HSTS、HTTP 跳 HTTPS。混合内容属于“资源层问题”,不在证书校验范畴,证书检测工具扫不出来。
几个高频遗漏场景:
- 数据库富文本:早年录入的文章、商品详情里写死 http 图片地址;
- 第三方组件:统计、客服、地图、广告、短信、支付回调组件,内置硬编码 HTTP;
- 上传存储:老图片、附件存到对象存储,历史链接没有批量替换;
- 模板、缓存、JS 拼接地址:代码里拼接域名,写死协议头;
- 移动端、小程序内嵌页、后台管理页:前台修好,后台没人测;
- CDN、代理、静态资源独立域名:主站换证书,资源站没同步;
- 缓存机制:页面缓存持久化,改完代码但缓存还是旧链接。
还有一个很容易踩的误区:配置了 https 跳转,就以为万事大吉。跳转只管用户输入的访问入口,管不住页面内部写死的资源地址。
三、带来的实际影响,不止是锁标消失
很多人觉得只是难看,实际上损失是多层的:
- 浏览器安全标识丢失:锁变成感叹号,用户不信任,转化率下降;
- 功能随机失效:脚本、接口被拦截,订单、登录、上传间歇性故障;
- SEO 负面影响:搜索引擎把混合内容视作安全缺陷,影响收录与排名;
- 安全漏洞:中间人攻击入口,加密页面下明文资源可以被篡改;
- 合规风险:涉及用户隐私、支付、身份信息的站点,等保、合规审计会标记该问题;
- 跨端异常:微信、抖音、小程序内嵌页面遇到混合内容,会直接拦截页面。
四、快速定位混合内容
最基础方式:浏览器按 F12,切换到控制台,搜索关键词 Mixed Content,会直接输出被拦截资源的完整地址;网络面板可以筛选协议,查看每个资源的加载协议。
自动化方案有三条:
- 爬虫扫描:全站遍历,抓取所有资源链接,识别 http 地址;
- 在线混合内容检测工具,输入页面地址即可出报告;
- 内容安全策略上报:开启违规上报地址,把混合内容违规请求自动收集成日志,适合业务量大、页面多的站点。
五、分层修复方案(从临时到根治)
【动手验证入口】 看懂原理之后,最快的方式是自己上线跑一遍:前往 JoySSL 注册一个账户,注册时务必填写注册码 230986,即可获得测试 SSL 证书的使用权限,用真实域名验证证书链、跳转和资源升级的实际效果。边看边测,比纯读文档印象深得多。
1. 优先用协议相对地址(谨慎) 写成 //domain.com/xxx.js,不写 http 或 https,跟随当前页面协议。缺点:如果页面本身走 http,又变回明文,适合过渡期,不适合长期依赖。
2. 批量替换存量链接 代码、模板、配置文件全局替换;数据库批量更新富文本字段。这里一定要注意备份,避免误替换第三方合法外部链接。
3. 服务器自动升级请求 在 Nginx 或 Apache 响应头下发 Content-Security-Policy: upgrade-insecure-requests; 浏览器收到这个头之后,会自动把页面里所有 HTTP 资源请求升级成 HTTPS,是很好用的兜底手段。注意:这只是浏览器行为,如果目标资源本身不支持 HTTPS,还是会加载失败。
4. 策略严控并上报 内容安全策略不仅可以升级,还可以强制拦截并上报违规地址,适合业务稳定后作为长期安全基线。
5. 配套 HSTS,形成完整闭环 HSTS 告诉浏览器永远用 HTTPS 访问本站;upgrade-insecure-requests 处理内部资源升级;301 处理入口跳转。三者搭配,才是一套完整 HTTPS 方案。很多站点只做了跳转,漏掉资源升级这一步。
顺便说一句,证书解决的是通道身份与加密,混合内容解决的是页面内所有子资源的加密一致性,两者不能互相替代。证书配置得再漂亮,只要页面里还混着一条明文资源,锁标照样会掉。
六、上线验收清单(避免漏测)
很多混合内容问题只在特定页面、特定用户场景出现,不能只测首页:
- 首页、栏目页、文章详情、商品页、搜索页;
- 用户中心、登录、支付、表单提交页面;
- 后台管理、编辑器预览页;
- 移动端、微信内嵌、APP webview;
- 打开浏览器控制台,确认无 Mixed Content 报错;
- 关闭缓存、清理 CDN 缓存后复测;
- 把混合内容检测加入发布流程,每次上线自动扫描。
七、总结
SSL 和 HTTPS 不是“一张证书搞定一切”。证书负责主连接身份加密,混合内容考验的是全站所有资源引用的一致性。它隐蔽、分散,大量藏在历史数据和第三方组件里,证书检测工具无法发现,是 HTTPS 改造里典型的“完成度陷阱”。
一套稳妥的落地顺序:证书部署 → 域名 301 跳转 → 存量资源链接清洗 → 配置 upgrade-insecure-requests 兜底 → 策略上报监控 → HSTS 固化。做完这一套,才算真正拿到稳定可信的安全锁标。