Discuz 开启 SSL 后全站跳转 HTTPS 混合内容报错怎么解决

文章导读
Discuz 开启 SSL 后出现混合内容报错,核心原因是页面通过 HTTPS 加载但引用了 HTTP 资源。最推荐的处理方向是全站替换资源链接为 HTTPS 并修正程序内的协议判断逻辑,风险边界在于修改核心文件可能导致升级冲突或 UCenter 通信失败。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Discuz 开启 SSL 后出现混合内容报错,核心原因是页面通过 HTTPS 加载但引用了 HTTP 资源。最推荐的处理方向是全站替换资源链接为 HTTPS 并修正程序内的协议判断逻辑,风险边界在于修改核心文件可能导致升级冲突或 UCenter 通信失败。

先说结论:Discuz 全站 HTTPS 需同时修改数据库配置、核心代码协议判断及模板资源链接,仅开启服务器 SSL 无法消除混合内容报错。

  • 先确认:浏览器控制台报错的具体 HTTP 资源地址,区分是本地文件还是第三方引用。
  • 先处理:修改 Discuz 后台 URL 设置及核心 PHP 文件中的 HTTPS 判断逻辑,确保内部跳转不走 HTTP。
  • 再验证:检查地址栏锁形图标是否闭合,测试会员登录及 UCenter 通信是否正常。

命令速用版

若使用 Nginx 服务器,可在配置文件中添加强制跳转和 CSP 策略,减少手动修改代码的工作量。

server { listen 80; server_name yourdomain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name yourdomain.com; add_header Content-Security-Policy "upgrade-insecure-requests"; }

Apache 服务器可在.htaccess 文件中添加重定向规则。

RewriteEngine on RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [L,R]

为什么会这样

混合内容报错是因为浏览器安全策略阻止了 HTTPS 页面加载 HTTP 资源。当网页通过 HTTPS 协议加载,但其中引用的图片、脚本、样式表或 iframe 等资源仍使用 HTTP 协议时,现代浏览器会判定为不安全并阻止加载或显示警告。

Discuz 程序旧版本或部分插件可能硬编码了 http:// 链接,或者服务器端判断协议逻辑未适配 HTTPS 环境,导致生成的页面内容包含不安全链接。

分步处理

按照以下顺序操作,确保从数据库到代码层全面适配 HTTPS。

1. 修改后台网站 URL 设置

登录 Discuz 后台,进入全局设置,将网站 URL 填写为 https:// 开头的地址。在 UCenter 设置中,将 UCenter 访问地址和应用的主 URL 也修改为 https:// 开头。

2. 修正核心文件协议判断

部分虚拟主机或反向代理环境下,$_SERVER['HTTPS'] 可能无法正确获取状态,需修改代码。

打开 source/class/discuz/discuz_application.php,查找$_G['isHTTPS'] 相关判断,确保能识别 HTTPS 环境。若遇到后台无法登录,可尝试将判断条件增加$_SERVER['HTTP_FROM_HTTPS'] 支持。

Discuz 开启 SSL 后全站跳转 HTTPS 混合内容报错怎么解决

打开 uc_server/avatar.php,修改 UC_API 定义,增加端口 443 判断或强制 https 协议,防止头像加载报错。

3. 模板文件批量替换

检查 template/default/common/header.htm 等模板文件,将硬编码的 http:// 替换为 https:// 或协议相对 URL//。

4. 启用 CSP 自动升级(可选)

在后台 SEO 设置或其他头部信息中加入,指示浏览器自动将 HTTP 请求升级为 HTTPS。注意此方法要求所有资源必须支持 HTTPS 访问,否则会导致资源加载失败。

怎么验证是否生效

操作完成后,通过以下方法确认修复效果。

1. 浏览器控制台检查

按 F12 打开开发者工具,切换到 Console 标签页,刷新页面。若没有红色的 Mixed Content 报错,说明资源加载已安全。

2. 地址栏锁形图标

观察浏览器地址栏,若显示闭合的锁形图标且无“不安全”提示,表示全站 HTTPS 生效。

3. 功能测试

Discuz 开启 SSL 后全站跳转 HTTPS 混合内容报错怎么解决

测试会员登录、发帖、头像显示及 UCenter 通信。若登录后无跳转失败或空白页,说明内部跳转逻辑已修正。

常见坑

处理过程中需注意以下易错点,避免引发新问题。

1. UCenter 通信失败

修改 HTTPS 后,若 UCenter 应用管理出现空白或通信错误,通常是 UC_API 地址未同步更新或协议判断逻辑错误,需检查 uc_server 目录下的配置文件。

2. 历史内容硬编码

数据库中已发布的帖子内容若包含硬编码 http:// 图片链接,不会自动变更。需使用数据库工具批量替换帖子内容中的 http:// 为 https://,前提是图床支持 HTTPS。

3. 第三方资源不支持

若引用了不支持 HTTPS 的第三方脚本或图片,启用 CSP upgrade-insecure-requests 会导致这些资源加载失败,页面出现残缺。此时需更换资源源或移除引用。

常见问题

修改后后台无法登录怎么办?

通常是协议判断逻辑未适配当前服务器环境。检查 source/class/discuz/discuz_application.php 中的 isHTTPS 判断代码,尝试增加$_SERVER['HTTP_FROM_HTTPS'] 判断条件,或确认反向代理是否传递了正确的 HTTPS 标识。

地址栏锁形图标还是不显示?

说明仍有隐藏的 HTTP 资源未修复。使用浏览器开发者工具的 Network 面板,筛选所有请求,查找状态为 blocked 或协议为 http 的资源,定位后修改对应代码或数据库内容。

开启 CSP 升级后图片不显示?

这是因为部分资源服务器不支持 HTTPS 访问。CSP 升级指令不会回退到 HTTP,若目标资源无 HTTPS 接口,请求会直接失败。需更换支持 HTTPS 的 CDN 或移除该资源。

参考来源

  • 解决 DISCUZ 出现 https 和 http 引入文件报错 static/image/common/dzicon.woff2 的一个方案
  • Discuz!启用 HTTPS 问题解决方法 - 中国人醒来了 - 博客园
  • discuz、ecshop、帝国 cms 部署 https(ssl) 后会员无法登录
  • HTTPS 混合内容错误的完整解决方案
  • 浏览器显示此页面包含不安全的内容 修复混合内容错误【教程】