搜索全站
安全防护 9 分钟阅读

配置 SSL 后提示混合内容不安全 Mixed Content 怎么解决

装上 SSL 后小锁标变灰色感叹号、控制台一直报 Mixed Content?这是页面里还夹着 http 资源。本文讲清成因,用 Really Simple SSL 插件与 WP-CLI 数据库批量替换两种方法,把 http 链接全部换成 https,让网站恢复安全绿色标识。

U
UFO_PF 2026-08-08 · 阅读 9 分钟
配置 安全防护
阅读提示
本文约 3,346 字,预计阅读 9 分钟。文中命令与配置均经过实测,可直接参考执行。

引言

给网站装好 SSL 证书、把访问地址切到 https://,本以为地址栏会出现让人安心的绿色小锁,结果却是一个灰色或带感叹号的图标,点开提示「网站连接不安全」。按 F12 打开浏览器控制台,一行行红字扑面而来:Mixed Content: The page at 'https://你的域名' was loaded over HTTPS, but requested an insecure resource 'http://...'. This request has been blocked. 这就是经典的混合内容(Mixed Content)问题——页面主体走了 HTTPS,但里面某些图片、脚本、样式或字体仍然通过 http 加载,浏览器为了安全会拦截或标记它们。它带来两个直接后果:小锁标消失、用户体验打折;被拦的图片或脚本显示不出来,页面排版错乱。本文带你定位到底是哪些资源在拖后腿,并用插件和数据库两条路线彻底改成 https。

故障原因分析

  1. 数据库里残留 http 链接。文章正文、自定义字段、小工具里早期写的图片和链接地址都是 http://,改域名时没同步替换。
  1. 主题或插件硬编码 http。部分老主题、老插件的代码里把资源地址写死成 http://,不随站点协议自动跟随。
  1. 外部资源不支持 https。引用的一些第三方图片、统计脚本、字体库只有 http 地址,或干脆没有 https 版本。
  1. CSS 文件里的背景图用到 http。样式表中 background: url(http://...) 这类写法也属于混合内容,容易被忽略。
  1. 数据库 siteurl、home 与前台协议不一致。如果这两项还是 http,全站生成的链接都会退回 http,引发大面积混合内容。

分步解决方案

方法一:先找出到底是哪些资源在用 http

打开首页,按 F12 切到「Console」,看被拦截或警告的红色条目,逐条记下具体 URL;再切到「Network」标签,筛选 http,能列出所有以 http 加载的请求。把域名归类:是站内资源、还是外部第三方资源,处理方式不同。也可以用命令行快速抓一遍页面里的 http 引用:

curl -s https://你的域名/ | grep -o "http://[^\"']*" | sort -u | head -50

方法二:用 Really Simple SSL 快速修复(最省事)

Really Simple SSL 是专门处理这类问题的免费插件,能自动把可修复的 http 请求改成 https:

  1. 后台安装并启用 Really Simple SSL。
  2. 插件会检测到你的证书,点「激活 SSL」一键切换。
  3. 进入「设置 → SSL」,打开「修复混合内容」相关选项,它会扫描并改写残留的 http:// 引用。

对大多数个人站,这一步就能解决绝大部分混合内容。注意:它主要处理站内资源,外部第三方只支持 http 的资源它改不了,需要另行替换。

方法三:用数据库批量替换 http 为 https

想从根上换干净,直接在数据库做全局替换。推荐用 Better Search Replace 插件(图形界面、支持 dry run 预览),或 WP-CLI 命令行(更快更稳):

# 用 WP-CLI 把全库中的 http://你的域名 替换为 https://你的域名
wp search-replace 'http://你的域名' 'https://你的域名' --all-tables --precise --dry-run

# 预览没问题后,去掉 --dry-run 正式执行
wp search-replace 'http://你的域名' 'https://你的域名' --all-tables --precise

--precise 能避免误改序列化数据造成结构损坏。执行前务必先备份数据库。如果你用的是图形化工具,也可以导出整库 SQL,用编辑器把 http://你的域名 全部替换为 https://你的域名 后再导入。

方法四:确认 siteurl 与 home 已是 https

替换完数据库链接后,检查 wp_options 里这两项:

SELECT option_name, option_value FROM wp_options WHERE option_name IN ('siteurl','home');

两者都应该是 https://你的域名。如果你不方便进数据库,也可以在 wp-config.php 里强制指定,避免被后台误改:

// wp-config.php —— 强制站点地址为 https
define( 'WP_HOME', 'https://你的域名' );
define( 'WP_SITEURL', 'https://你的域名' );

方法五:处理主题、插件与外链的硬编码

数据库替换解决不了写在代码里的 http。用命令行在主题和插件目录里搜(注意先排除已替换的部分):

grep -rn --include="*.php" --include="*.css" --include="*.js" "http://你的域名" wp-content/themes wp-content/plugins | head -50

找到后逐个改成 https://你的域名,或改成协议相对写法。主题改动用子主题;插件里的硬编码优先升级到最新版,仍不行再考虑手动修改(升级会覆盖,需记录)。

方法六:替换不支持 https 的外部资源

方法二、三只处理你域名下的资源,外部第三方(如某个图床、统计服务)始终是 http 的,插件也救不了。解决办法是:把它换成支持 https 的同类服务,或把图片下载到自己服务器改成本地 https 地址。例如把 http://cdn.某站/xxx.jpg 换成 https://cdn.某站/xxx.jpg(若对方支持),否则直接更换来源。

方法七:清理缓存后复验

改完数据库和代码后,清空 WordPress 缓存插件、CDN(Cloudflare 等)缓存和浏览器缓存,再刷新页面。此时 F12 控制台不应再有 Mixed Content 报错,地址栏出现完整的锁标。若报错减少但没清零,重复方法一,找出剩余的 http 来源继续处理。

常见踩坑点

  1. 只改 siteurl 不做全库替换。首页地址变 https 了,文章内的图片链接还是 http,混合内容依旧存在。
  1. 替换前不备份数据库。批量替换一旦出错很难回滚,动手前先导出整库。
  1. 用了不严谨的替换工具。直接把序列化数据里的 http 字符串长度改短(https 比 http 多一个字符),会导致序列化失效,务必用带 --precise 的 WP-CLI 或 Better Search Replace。
  1. 忘了清 CDN 和浏览器缓存。缓存里的旧页面仍带着 http 资源,让人误以为没改成功,改完一定要清缓存再测。
  1. 期待插件解决外部资源。Really Simple SSL 只能处理站内资源,第三方 http 资源必须手动换。
  1. 修改了插件硬编码又被升级覆盖。插件升级会重置代码,最好优先升级到官方已修复 https 的版本。

总结

混合内容(Mixed Content)本质是 HTTPS 页面里还夹着 http 资源,浏览器为了安全会拦截或取消安全标识,从而出现「装了 SSL 却显示不安全」的怪象。修复顺序是:先用控制台和 curl 找出所有 http 引用,再用 Really Simple SSL 一键修复站内资源,接着用 WP-CLI 或 Better Search Replace 把数据库里的 http://你的域名 全局替换成 https://,确认 siteurl/home 已是 https,处理主题插件里的硬编码和外链资源,最后清理缓存复验。真正做完整套 WordPress 混合内容修复,地址栏的绿色小锁才会稳稳出现。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。