网站后台验证码不显示
发布时间:2025-12-28 14:40       
更新时间:2025-12-28 16:51
后台登录页的验证码位置只剩一个裂开的图标,刷新也不见好,按经验是 gd 库、session、缓存、防盗链四个原因之一。
## gd 库没装或没启用
PHP 生成图片依赖 gd 扩展(图像处理库),缺了它验证码脚本直接报错。检查:
php -m | grep gd
没有输出就安装:Ubuntu 执行 apt install php-gd,CentOS 执行 yum install php-gd,装完重启 php-fpm。判断是不是这个原因有个快捷办法:直接用浏览器打开验证码脚本的地址(比如 /captcha.php),页面若输出 PHP 报错信息,基本可以锁定扩展问题。
依赖不全会更隐蔽:FreeType、libpng 这类库缺失时,gd 装了也画不出字和图,php -i | grep -i gd 看输出里依赖是否列全,缺什么补什么。
## session 写不进去
多数验证码的机制是"生成时把答案写进 session(服务器端会话数据),提交时比对"。session 文件写不进去,图片即使显示出来也永远校验失败。检查两点:session.save_path 指向的目录是否存在且可写;磁盘是否已满。
php -r "echo ini_get('session.save_path');"
ls -ld /var/lib/php/session
目录属主不对就 chown 给 php-fpm 的运行用户,磁盘满了参考清理流程腾空间。个别框架的验证码把答案存进数据库或独立缓存,这类实现要检查对应存储的连接与权限,session 正常不代表全局正常。
## 缓存与防盗链误伤
两类容易被忽略的干扰:CDN(内容分发网络)或页面缓存把验证码接口的响应缓存了下来,所有人看到同一张图,验证自然失败,需要给验证码地址加 Cache-Control: no-store 响应头,并在缓存侧排除该路径;如果验证码由独立子域提供,页面所在域名的防盗链规则可能把它当外链拦掉,检查 Nginx 里 valid_referers 相关配置,用 curl -I 验证码地址看返回码是否异常。
curl -I 的输出重点看两项:返回码是不是 200,Content-Type 是不是 image/png;返回 text/html 说明脚本抛了错误,异常信息往往就藏在响应体里。
四个方向按"先报错信息、再 session、后缓存与防盗链"的顺序走,多数十分钟内能定位。浏览器插件拦截图片、企业网络的过滤脚本,也会造成只有个别人看不到的个案,换设备交叉验证再下结论。改完务必清一次浏览器缓存再验证,避免被旧响应误导。