# 启用 HTTPS 后修复混合内容警告

Source: https://support.kapsulehost.com/zh-cn/ssl-mixed-content

## 什么是混合内容

浏览器只有在页面及其加载的所有内容都通过 HTTPS 传输时，才会将页面视为安全的。如果 HTTPS 页面从 `http://` 地址拉取图像、脚本、样式表、字体或 iframe，浏览器会标记它。

浏览器将此分为两类，其行为大不相同：

- **主动混合内容**：脚本、样式表、iframe 和 XHR。浏览器会完全阻止这些。布局会崩溃，滑块停止工作，表单无法提交。这是具有破坏性的那一类。
- **被动混合内容**：图像、音频和视频。这些通常仍会加载，但挂锁会被降级或移除。

因此，站点可能看起来完全正常，但仍然会失去挂锁，或看起来损坏但页面本身没有明显错误。

## 启用 SSL 后为什么会发生这种情况

启用 SSL 会改变站点的提供方式。它不会改变站点内存储的内容。

WordPress 将绝对 URL 写入数据库，因此曾在 HTTP 上运行过任何时间的站点在以下位置保存了 `http://` 地址：

- 文章和页面内容，包括通过编辑器插入的每张图像。
- 媒体附件记录。
- 主题定制器设置和主题选项。
- 小工具内容和区块设置。
- 插件设置，特别是页面构建器和滑块插件。
- `siteurl` 和 `home` 选项。

以上都不会自动更新。启用 SSL 然后想知道为什么挂锁坏了，是最常见的支持问题之一，这就是原因。

## 步骤 1：在服务器上强制 HTTPS

在接触数据库之前，请确保每位访客首先登陆在 HTTPS 上。

1. 登录 [KPanel](https://kpanel.kapsulehost.com)，然后单击左侧边栏中的**网站**。
2. 单击您的站点。
3. 打开**设置**。
4. 在**行为**下，打开**强制 HTTPS**。
5. 单击**保存更改**。

![KPanel 中站点设置页面上"行为"下的"强制 HTTPS"设置](https://support.kapsulehost.com/help/screenshots/ssl-mixed-content.6758a2bb.webp)

每个 HTTP 请求现在都会在您的站点运行前在服务器上重定向到 HTTPS。

> **Note:** 强制 HTTPS 处理传入的请求。它不会重写已存储在数据库中的 URL，因此单独它不会清除由硬编码 `http://` 图像引起的混合内容警告。您需要同时执行这个和步骤 2。

如果 SSL 尚未激活，或证书看起来有问题，请从 [SSL 证书](https://support.kapsulehost.com/zh-cn/ssl-certificates) 开始。

## 步骤 2：重写存储的 URL

这是实际解决混合内容的修复。

1. 打开站点，然后打开 **WordPress** 选项卡，然后打开**快速操作**部分。
2. 找到**搜索和替换**卡片并单击**配置**。
3. 在**查找（旧值）**中输入 `http://yourdomain.co.nz`。
4. 在**替换为**中输入 `https://yourdomain.co.nz`。
5. 保持**模拟运行（仅预览，不做更改）**勾选并单击**预览**。
6. 查看计数和每个表的明细。
7. 取消勾选**模拟运行**，单击**运行**，然后确认。

在替换前会自动进行完整备份，所有表（包括由插件创建的表）都被覆盖。序列化的插件设置会被正确处理。

> **Warning:** 不要在 phpMyAdmin 中使用 SQL 查询执行此操作。WordPress 将插件和主题设置存储为序列化字符串，记录每个值的长度，因此原始 `REPLACE()` 会破坏它们，设置会无声地重置为空。除了恢复备份外，没有修复方法。完整说明请参阅[运行搜索和替换](https://support.kapsulehost.com/zh-cn/wordpress-search-replace)。

如果您的计划包括控制台，等效命令是：

```
search-replace 'http://yourdomain.co.nz' 'https://yourdomain.co.nz' --all-tables --dry-run
```

删除 `--dry-run` 以应用它，并请先自己进行备份：控制台不会进行备份。

## 步骤 3：清空每个缓存

页面的缓存副本会在数据库修复后很长时间内继续提供旧的 HTTP URL，这就是为什么人们通常认为替换不起作用。

1. **WordPress**，然后**快速操作**，然后**清空缓存**。
2. **WordPress**，然后**缓存**，然后**清除缓存**，如果启用了整页缓存。
3. **性能**，然后 **Kapsule CDN**，然后**清除**，如果启用了 CDN。请参阅[清除 CDN 缓存](https://support.kapsulehost.com/zh-cn/cdn-cache-purge)。
4. 任何缓存插件，从其自己的设置屏幕。
5. 您自己的浏览器。在私密窗口中测试，这样您不会被自己的缓存欺骗。

## 步骤 4：找出剩余的问题

大多数站点在步骤 2 后都是干净的。当警告仍然存在时，找出确切的资源，而不是猜测。

**浏览器控制台。** 按 F12 打开开发者工具，转到**控制台**选项卡，然后重新加载。混合内容会显示为显式警告，命名违规资源的完整 URL。该 URL 告诉您哪个插件或主题负责。

**网络选项卡。** 按 `http://` 筛选，以列出页面进行的每个不安全请求。

**页面源代码。** 加载页面，查看源代码，并搜索 `http://`。忽略 `xmlns` 属性和架构声明内的任何内容：这些是标识符，不是请求。

常见的剩余项及如何处理每个项：

| 您找到的内容 | 修复 |
|---|---|
| 主题定制器设置中的图像或徽标 | 在定制器中重新上传或重新选择它 |
| 具有键入的 `http://` 图像 URL 的页面构建器模块 | 编辑该模块并更正 URL |
| 滑块插件自己的设置表 | 重新保存滑块，或使用 `--all-tables` 运行搜索和替换 |
| 来自第三方域的字体或脚本 | 检查提供商是否提供 HTTPS。大多数现在都提供。切换 URL |
| 来自旧供应商的跟踪像素或嵌入 | 如果供应商没有 HTTPS，请将其删除。这是损坏的依赖项，不是 KapsuleHost 问题 |
| 主题模板文件中的硬编码 `http://` | 编辑模板，或更好的是，使用 `https` 或协议相对参考 |

> **Tip:** 如果只有一页受到影响，而站点的其余部分是干净的，那么原因是该页面上的内容，而不是站点范围的设置。在编辑器中打开它并查看它嵌入的媒体。

## 确认已修复

1. 在私密窗口中加载站点。
2. 挂锁应该是实心的，没有警告三角形，也没有划掉的迹象。
3. 单击挂锁。浏览器报告连接安全，没有混合内容通知。
4. 打开控制台并再次重新加载。零个混合内容警告。
5. 检查深层页面，而不仅仅是主页：内部页面、包含图像的博文以及商店上的结账。

## 防止其再次发生

- **保持强制 HTTPS 打开。** 这是一项单行设置，可消除整个问题类别。
- **永远不要将完整的 `http://` URL 输入内容。** 使用媒体库，该库现在存储 HTTPS 地址。
- **安装任何要求 URL 的插件后检查插件设置**。
- **在插件更新后留意返回的警告。** 某些插件会重置其自己存储的 URL。
- **在任何迁移后重新运行搜索和替换**，因为导入的数据库会带来旧主机的 URL：[从 cPanel 迁移网站](https://support.kapsulehost.com/zh-cn/sites-migrate-cpanel)。

## 疑难解答

**对我来说挂锁很好，对同事来说是坏的。** 缓存的页面。让他们在私密窗口中重新加载。

**替换后站点完全损坏。** 恢复自动预运行备份：[从备份恢复](https://support.kapsulehost.com/zh-cn/restoring-from-backup)。

**控制台显示不是我的域上的混合内容警告。** 第三方资源。您无法修复他们的服务器：要么他们支持 HTTPS 并且您切换 URL，要么您删除资源。

**一切都是 HTTPS 但站点根本无法加载。** 那不是混合内容。从[网站无法加载](https://support.kapsulehost.com/zh-cn/website-not-loading)开始，并检查 [SSL 证书](https://support.kapsulehost.com/zh-cn/ssl-certificates) 上的证书。

如果您已完成所有这些操作且警告仍然存在，请发送电子邮件至 [support@kapsulehost.com](mailto:support@kapsulehost.com)，并提供受影响的 URL 和浏览器控制台警告的确切文本。
