各位伙计!昨天字节曜博客的突发故障唠唠
昨天是不是有朋友打开字节曜博客的时候,弹出了这个报错界面?
我和另一位编辑昨天下午4点打算更文的时候,也撞上了这个问题——好好的站点突然就打不开了,当时急得不行
第一轮没结果的排查
一开始我们试了好几个思路,都没解决:
- 另一位编辑想换成WP来解决,结果Typecho的后台都打不开,没法装插件迁移数据,这个方案直接放弃
- 我怀疑是源码出问题,试着用备份恢复站点,结果也没起作用
折腾到晚上一点头绪都没有,只好先把这事放一放
终于锁定“罪魁祸首”
第二天接着排查,很快就找到方向了:
- 先确认服务器没问题——宝塔面板能正常打开,排除服务器本身的故障
- 找了两个同样用Typecho搭建的站点测试:颤立诚小站和NaN博客都能正常访问,只有字节曜打不开
- 对比之后发现,只有字节曜装了78易航防火墙插件,另外两个站点都没装,结合插件故障的常见原因来看,这个私人加密的防火墙插件,大概率是和当前的Typecho环境出现了兼容性问题
有点曲折的解决过程
确定问题后,我们试了几个解决方法,走了点弯路:
- 先试着在数据库里删掉这个插件的对应数据,没起作用
- 试着删除插件目录,结果又爆出了新的报错:

只好先把目录恢复回来
后来发现是WebFirewall.php出了问题,这个插件的原版代码是加密的没法修改,所以我写了一个空壳文件替换它——这个空壳文件去掉了防火墙的功能,只保留了Typecho插件需要的基础结构,避免代码报错,同时兜底捕获未定义的方法调用,防止其他回调出问题:
<?php
/**
* WebFirewall 插件空壳(修复Typecho_Plugin类未找到错误)
* 去掉了防火墙功能(原版加密成13了,没法改)
* 作者:字节曜 寒烟似雪
*/
// 命名空间
namespace TypechoPlugin\WebFirewall;
// 引入Typecho核心类
if (!class_exists('Typecho_Plugin')) {
require_once __DIR__ . '/../../../var/Typecho/Plugin.php';
}
// 核心类(匹配错误提示的WebFirewall)
class WebFirewall
{
/**
* 插件激活方法(空实现)
*/
public static function activate()
{
return true;
}
/**
* 插件禁用方法(空实现)
*/
public static function deactivate()
{
return true;
}
/**
* 插件配置方法(空实现)
*/
public static function config(\Typecho_Widget_Helper_Form $form)
{
// 空配置,无字段
}
/**
* 个人配置方法(空实现)
*/
public static function personalConfig(\Typecho_Widget_Helper_Form $form)
{
// 空配置
}
/**
* 兜底:捕获所有未定义的静态方法调用(防止其他回调报错)
*/
public static function __callStatic($name, $arguments)
{
return null;
}
}
// Typecho_Plugin前加\,表示调用全局命名空间的类
\Typecho_Plugin::factory('Plugin.php')->activate = ['TypechoPlugin\WebFirewall\WebFirewall', 'activate'];
\Typecho_Plugin::factory('Plugin.php')->deactivate = ['TypechoPlugin\WebFirewall\WebFirewall', 'deactivate'];
\Typecho_Plugin::factory('Plugin.php')->config = ['TypechoPlugin\WebFirewall\WebFirewall', 'config'];
\Typecho_Plugin::factory('Plugin.php')->personalConfig = ['TypechoPlugin\WebFirewall\WebFirewall', 'personalConfig'];
?>替换之后顺利进到了后台,第一件事就是把这个私人插件卸载了:
给同用Typecho的朋友提个醒
如果你们也遇到这类私人加密插件导致站点打不开、后台进不去的情况,可以试试这个空壳文件的方法:
- 替换对应的插件PHP文件
- 进到后台后直接卸载插件