麒麟在线

当前位置:网站首页 / 技术 / 正文

Discuz X3.4论坛版块页面打不开,显示空白

核心原因:服务端输出了 0 字节的空内容(Content-Length: 0 / 空白响应)

仔细对比这两次的响应头,你会发现一个关键属性消失了:

  • 上次响应头包含Transfer-Encoding: chunked(服务器在分块发送数据流)

  • 这次响应头既没有 Transfer-Encoding: chunked,也没有 Content-Length

在 HTTP/1.1 和 HTTP/2 协议中,这意味着服务器虽然正常处理了请求并返回了 200 OK,但发送给浏览器的网页主体(Body)字节数为 0。换句话说,服务器传给你的就是一个彻底的空文件。

为什么服务器会返回 0 字节?

结合 Cookie 中的 lWEi_2132_lastactlWEi_2132_forum_lastvisit 信息(这是典型的 Discuz! 论坛系统),这种“HTTP 200 OK 但内容为空”的情况在 Discuz! 架构中非常经典,通常由以下后端问题引起:

  1. PHP 报错但关闭了 display_errorsDiscuz! 在渲染页面模板时发生了致命错误(Fatal Error,例如数据库查询失败、内存溢出 Memory Limit Exceeded 或插件代码冲突)。PHP 在报错后直接终止运行,但因为服务器配置了隐蔽报错,没有将错误提示输出给前端,导致输出流直接被切断,只留下了头部信息。

  2. Discuz! 伪静态规则配置错误URL 是 forum-37-1.html,这是伪静态重写链接。如果 Nginx/Apache 的 rewrite 规则写错,导致请求被转发给了一个不存在的 PHP 脚本或错误的参数,PHP 执行完空逻辑后就会返回白屏。

  3. 服务器防刷/缓存插件拦截Discuz! 自带防刷机制或安装了缓存插件(如 Redis/Memcached 挂掉)。当触发频次限制时,部分防刷插件未弹出验证码,而是直接执行了 exit;die();,从而输出空白页。

验证与确认方法

要 100% 确定是不是 0 字节响应:

  1. 打开浏览器 F12 开发者工具 -> 切换到 Network (网络) 标签页。

  2. 刷新页面,点击 forum-37-1.html 请求。

  3. 查看右侧的 Response (响应) 栏。如果里面完全没有任何代码/文本,或者 Size (大小) 显示仅为几十字节(只有 Header 的大小),就证实了是服务端返回了空数据。

排查发现:

Response (响应)是空的

尝试访问该板块的 RSS 订阅接口(如果开启了):

https://www.XXX.net/forum.php?mod=rss&fid=37

可以正常打开,彻底排除了数据库损坏、板块被删或全局系统瘫痪的可能性

因为RSS(forum.php?mod=rss&fid=37)能够正常输出数据,这说明 数据库、板块数据以及核心数据查询逻辑完全没问题

问题 100% 发生在 forumdisplay(板块列表页)的模板渲染、缓存生成或特定插件/扩展执行环节。PHP 在尝试渲染该页面时抛出了致命错误(Fatal Error),由于线上环境关闭了报错输出,导致直接输出了 0 字节的白屏。

请按照以下步骤排查并修复:

第一步:排查并清除 Discuz! 模板与数据缓存(最快速恢复方案)

很多时候白屏是因为 Discuz! 生成的模板编译缓存文件损坏或写入中断。

  1. 进入 Discuz! 后台(admin.php)。

  2. 导航至:工具 -> 更新缓存

  3. 勾选所有缓存(数据缓存、模板缓存等),点击确定更新

  4. 手动清理 FTP 缓存目录(如果后台更新无效):使用 FTP/SSH 连接服务器,清空以下目录下的所有文件(注意保留目录本身):

    • /data/template/ (模板编译缓存)

    • /data/cache/ (数据缓存)

第二步:开启 PHP / Discuz! 报错,精准定位报错代码

只要能看到具体的报错信息,问题就解决了 90%。

  1. 1、开启 Discuz! 开发者调试模式:打开网站根目录下的 config/config_global.php,找到或添加以下配置:

$_config['debug'] = 2; // 开启详细报错显示

2、开启 PHP 报错显示(临时):forum.php 文件顶部(<?php 正下方)临时加入以下代码:

ini_set('display_errors', 1);
error_reporting(E_ALL);
  1. 3、刷新 https://www.XXX.net/forum.php?mod=forumdisplay&fid=37。此时页面不会再是白屏,而是会打印出类似下面的红色/黑色报错信息:

    • Fatal error: Call to undefined function...:调用的函数不存在(常见于插件文件缺失)。

    • Parse error: syntax error, unexpected...:模板或 PHP 文件语法错误。

    • Allowed memory size of xxx bytes exhausted...:PHP 内存溢出。

(排查完毕后记得将 debug 关闭并删除添加的测试代码)


致命错误定位

日志最后一行直接抛出了 PHP 的致命错误(Fatal Error):

Fatal error: require_once(): Failed opening required '' (include_path='.:/www/server/php/53/lib/php') 
in /www/xxx/source/plugin/freeaddon_forumdisplay_rate/hook.class.php on line 42

原因分析:

  • 插件 freeaddon_forumdisplay_rate(板块列表页评分/评价显示插件)在第 42 行尝试使用 require_once() 引入一个文件。

  • 但由于该插件配置缺失或代码存在 Bug,导致传入的文件路径为空(''),PHP 无法加载文件,直接中断了整个页面的渲染,输出空白。

快速修复方案:

后台禁用/卸载该插件(最安全推荐)

  1. 登录 Discuz! 后台:https://www.xxx.net/admin.php

  2. 导航至:应用 -> 插件

  3. 找到名为 freeaddon_forumdisplay_rate(或类似“列表页评分”)的插件。

  4. 点击 关闭卸载

  5. 进入 工具 -> 更新缓存,清理一次缓存即可彻底恢复正常。

推荐阅读

文章标签:

版权声明: 本文除特别说明外均由原创

本文链接: https://www.70ol.com/jishu/379.html,尊重共享,欢迎转载,请自觉添加本文链接,谢谢!

分享本文: 请填写您的分享代码。

呃 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。