# 混合内容（Mixed Content）是什么？

> 混合内容是指通过 HTTPS 加载的页面中，部分脚本、图片、iframe 等子资源仍通过明文 HTTP 加载，削弱了整个页面的安全性。

Source: https://ssl.sh/zh/glossary/mixed-content/
Last updated: 2026-11-10

混合内容指一个通过 [HTTPS](https://ssl.sh/zh/glossary/https/) 交付的页面引用了明文 HTTP 的子资源。浏览器把它分为两类：主动混合内容（脚本、样式表、iframe、fetch/XHR 请求等）能改变整个页面，会被直接拦截；被动混合内容（图片、音频、视频）在当前的 Chrome 和 Firefox 中会被自动改用 HTTPS 重试，失败就不加载。

## 为什么重要
攻击者只要能篡改其中一个 HTTP 脚本，就能控制加载它的 HTTPS 页面，包括表单和未设置 HttpOnly 的 Cookie。用户看到的是锁形图标消失或出现警告，被拦截的资源加载不出来，页面功能随之出错。常见原因有：模板或 CMS 数据库里写死的 `http://` 地址、老旧的第三方组件，以及网站接入 CDN 或 HTTPS [反向代理](https://ssl.sh/zh/glossary/reverse-proxy/)后，后端仍以为自己跑在 HTTP 上，生成的链接全是 `http://`。WordPress 站点迁移到 HTTPS 后没有改站点地址，就是典型例子。

## 例子
查找写死的 HTTP 引用，或者使用[混合内容扫描工具](https://ssl.sh/zh/tools/mixed-content-scanner/)：

```bash
curl -s https://example.com | grep -oE '(src|href)="http://[^"]+"'
```

从源头修正链接，再加一道保险，让浏览器自动升级剩余请求：

```nginx
add_header Content-Security-Policy "upgrade-insecure-requests" always;
```

## 常见误区
- **混合内容只影响锁形图标的显示。** 对图片来说如今基本如此，因为浏览器会自动升级；但混合的脚本或 iframe 等于把页面控制权交给了链路上的任何人。
- **资源所在服务器加个 HTTPS 跳转就行。** 浏览器在发出请求之前就拦截了主动混合内容，根本看不到跳转，必须修改页面里的地址。
- **开了 HSTS 就没有混合内容。** [HSTS](https://ssl.sh/zh/glossary/hsts/) 只升级发送过该头的主机，第三方的 HTTP 资源不受影响。

## 相关术语

- [HTTPS](https://ssl.sh/zh/glossary/https/): HTTPS 是在 TLS 加密连接之上传输的 HTTP，默认使用 443 端口，使网页内容、Cookie 和表单数据被加密，并验证服务器身份。
- [HSTS](https://ssl.sh/zh/glossary/hsts/): HSTS 是一个 HTTP 响应头，告诉浏览器在指定时间内只通过 HTTPS 访问该站点，并且遇到证书错误时不允许用户继续访问。
- [反向代理](https://ssl.sh/zh/glossary/reverse-proxy/): 反向代理是代表后端服务器接收客户端连接、再把请求转发给后端的服务器，通常同时承担 TLS 终止。
- [中间人攻击](https://ssl.sh/zh/glossary/man-in-the-middle/): 中间人攻击是指攻击者暗中插入通信双方之间，转发并可能篡改流量，而双方都以为自己在直接和对方通信。
- [TLS 终止](https://ssl.sh/zh/glossary/tls-termination/): TLS 终止是指网络路径上客户端 TLS 连接结束并被解密的位置，可以是 CDN 边缘、负载均衡、反向代理，也可以是应用服务器本身。
