检查

混合内容扫描

找出 HTTPS 页面里仍然通过 http:// 加载的资源,以及其中哪些会被浏览器拦截。

只扫描这一个页面的 HTML 里的 http:// 资源,JavaScript 之后加载的内容扫不到。

最后核实

混合内容扫描检查 HTTPS 页面里还有没有通过 http:// 加载的资源。输入完整的页面网址,点 扫描页面,工具会列出每个不安全的脚本、样式表、图片、iframe 和表单地址,并单独统计会被浏览器拦截的主动内容。

怎么用

  1. 输入页面网址,比如 https://example.com/blog/。不同模板的页面都要测:首页、文章页、商品页、下单页。
  2. 点 扫描页面。
  3. 逐个修改列出的地址,再扫一遍。

主动与被动混合内容

  • 主动内容能改变整个页面:脚本、样式表、iframe、字体、fetch/XHR 请求。浏览器会直接拦截,功能就坏了。
  • 被动内容只是显示,不能改页面:图片、音频、视频。新版 Chrome 和 Firefox 会先尝试用 HTTPS 加载,失败就拦截;无论哪种情况,页面都不再算“安全”。

怎么修

  1. 把模板、主题、数据库里写死的 http:// 改成 https://(自己站内的文件可以用相对地址)。WordPress 之类的站点,换域名或上 HTTPS 后数据库里经常残留旧地址。
  2. 第三方资源(统计代码、广告、图床、老 CDN)确认支持 HTTPS,不支持就换掉。
  3. 兜底:返回响应头 Content-Security-Policy: upgrade-insecure-requests。
  4. 全站干净之后,开启 HSTS,浏览器就再也不会发明文请求。

扫描只读取服务器返回的 HTML,不执行 JavaScript。单页应用还要在浏览器控制台里看混合内容警告。

常见问题

地址栏没有锁,但扫描什么都没发现?

不安全的请求多半是 JavaScript 在页面加载后发出的,或者来自别的页面。打开浏览器开发者工具的控制台,混合内容警告会带上具体网址。

只加 upgrade-insecure-requests 就够了吗?

它让浏览器把 http:// 子资源改用 HTTPS 请求,能很快修好大部分页面,前提是这些资源本身支持 HTTPS。长期还是要把模板和数据库里的地址改掉。

指向其他网站的 http:// 链接算混合内容吗?

不算。用户点击的普通链接(a href)是跳转,不是子资源。但提交到 http:// 的表单会被标出来,因为提交的数据会明文传输。

资料来源

  1. W3C Mixed Content
  2. MDN: 混合内容