苹果CMS 如何修复后台验证码不显示?
照这篇走一遍,你就能自己定位苹果CMS后台验证码空白、破图、刷不出来的原因,并把它修好,不用重装系统。
后台登录页的验证码是一张 PHP 用 GD 库实时画出来的图片,所以"不显示"从来不是玄学,无非是画不出来或画出来了但传不过去。按下面的顺序查,五分钟内基本能锁定。
第一步:先看清是哪种"不显示"
打开浏览器按 F12,切到 Network(网络) 面板,刷新后台登录页,在请求列表里找到那条验证码请求(名字通常含 captcha 或 verify,自己看列表里的实际地址),点开它看三个信息:状态码、响应内容、响应头 Content-Type。
对着结果判断:
- 200 但响应体是空白 / 一个 0 字节图片 → 图片生成失败,跳到第二步
- 500 → PHP 报错,跳到第三步看错误日志
- 404 → 请求根本没到程序,是伪静态或路径问题,跳到第六步
- 302 → 被跳转走了,多半是登录态或 HTTPS/域名问题
注意:不要凭"页面上那个位置是空的"下判断,空白和破图是两种完全不同的病,F12 一眼就能分开。
第二步:确认 GD 扩展装了没有(最高频原因)
没有 GD,PHP 就没有画图能力,验证码必然空白。宝塔面板的操作路径是:**软件商店 → 已安装 → 点开你站点在用的那个 PHP 版本 → 设置 → 安装扩展 → 勾选 gd → 安装,装完点一下"服务"里的重载配置**。
命令行环境执行:
php -m | grep -i gd
输出里有 gd 才算装好。
注意:宝塔里往往装了多个 PHP 版本,面板里给 gd 的那个版本,必须和站点实际使用的 PHP 版本一致(网站 → 站点 → 设置 → PHP 版本)。给 7.4 装了 gd、站点跑在 8.1,照样不显示。
第三步:看 PHP 错误日志,别猜
后台的验证码生成失败一定会留下痕迹。宝塔路径:网站 → 站点 → 设置 → 日志 → PHP 错误日志(或 PHP 设置 → 日志)。重点找关键词:
Call to undefined function imagettftext()→ GD 没装或没开Could not find/open font→ 验证码用的 ttf 字体文件丢了,把程序包里对应的字体文件补回去Cannot modify header information - headers already sent→ 输出污染,见第五步
第四步:检查 runtime 缓存目录可写
苹果CMS V10 是 ThinkPHP 系,运行期要往 runtime 目录写缓存和会话数据。这个目录不可写时,验证码值存不进去,页面就会反复提示验证码错误或图片异常。
确认 runtime 目录属主是 Web 用户(一般是 www),权限 755;实在排查不出来时临时给 777 测一次,确认是权限问题后再改回 755。
第五步:排查输出污染(BOM 与多余空白)
如果你直接访问验证码地址,看到的是一堆乱码字符或者"图片无法显示",典型原因是某个 PHP 文件开头带了 UTF-8 BOM,或者 ?> 之后多了空行,导致图片字节流前面被塞进了额外内容,浏览器就不认这是图片了。
排查办法:用编辑器(Notepad++ 可开"显示所有字符")逐一检查你最近改过的 PHP 文件,把编码转成 UTF-8 无 BOM,并删掉文件末尾的 ?>。同时清一次后台的缓存目录。
第六步:伪静态、CDN 与缓存
如果验证码请求返回 404,说明它被伪静态规则当成静态页重写了;如果返回 200 但内容明显是旧图,多半是 CDN 或浏览器缓存把动态请求当静态资源缓存了。
处理方式:在 CDN 里给验证码路径加不缓存规则;浏览器用无痕窗口再试一次;Nginx 伪静态只把非存在的文件转发给 index.php,别把规则写成 rewrite ^/(.*)$。
小结
- 先 F12 看状态码,空白图、500、404、302 是四条不同的排查线
- 最常见原因是 GD 扩展没装,其次是装了但和站点 PHP 版本不一致
- 生成失败先看 PHP 错误日志,
imagettftext和字体报错指向明确 runtime目录不可写会导致验证码校验异常,属主给 www、权限 755- 响应里出现乱码多半是文件 BOM 或多余空白造成的输出污染
- 404 找伪静态,内容不更新找 CDN 和浏览器缓存
原文链接:https://www.gj0.com/thread-13.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。