验证码图片不显示主因是字体路径错误导致php静默读取失败:需确认think\captcha\assets\font\1.ttf真实存在且大小写准确,改用dejavusans.ttf并以public_path()指定绝对路径,同时确保gd_info()['freetype support']为true。

验证码图片不显示,字体路径错误是常见原因——不是文件不存在,而是 PHP 读取失败,静默返回空白或红叉,根本不会报错。
确认字体文件真实存在且路径拼写准确
ThinkPHP 5.1 默认尝试加载 think\captcha\assets\font\1.ttf。先手动检查该路径是否真有文件:
- 运行
ls -l think/captcha/assets/font/1.ttf(Linux)或查看对应目录(Windows) - 注意大小写:Linux 下
Font/1.ttf和font/1.ttf是不同路径;Windows 虽不区分,但某些 PHP 版本(如 7.4+)经realpath()或 opcache 处理后会校验大小写,导致file_exists()返回false - 在
Captcha.php中临时硬编码路径测试:$this->font = __DIR__ . '/font/1.ttf';,再加var_dump(file_exists($this->font));验证
改用无版权、兼容性好的字体并指定绝对路径
别依赖 simhei.ttf 等 Windows 中文字体——它们常因路径含中文、UTF-8 BOM、权限不足或授权问题失效。
- 从 Google Fonts 下载
DejaVuSans.ttf(开源免费,支持英文和基础符号) - 放入
public/static/font/目录,确保 Web 进程用户(如www-data)有读权限:chmod 644 public/static/font/DejaVuSans.ttf - 在验证码配置中显式指定绝对路径:
'font' => public_path('static/font/DejaVuSans.ttf')
避开路径编码与权限陷阱
即使路径对,PHP 也可能因编码或权限卡住:
- 若必须用中文字体,路径含中文时需转 GBK:
$fontGbk = iconv('UTF-8', 'GBK//IGNORE', $fontPath);,再用@file_exists($fontGbk)判断 - 右键字体文件 → 属性 → 安全 → 确保“读取”权限勾选(Windows);Linux 下确认
ls -l显示-rw-r--r--类似权限 - 避免相对路径(如
./fonts/xxx.ttf),它易受当前工作目录影响;一律用__DIR__或public_path()构造绝对路径
验证 GD 是否真正支持字体渲染
路径再对,GD 缺 FreeType 支持也画不出字:
- 执行
php -r "var_dump(gd_info()['FreeType Support']);",结果必须是bool(true) - 若为
false,Linux 需装开发包:sudo apt install libfreetype6-dev(Ubuntu)或sudo yum install freetype-devel(CentOS),PHP 源码编译需加--with-freetype - Windows 建议换 XAMPP/WAMP 等集成环境,其 GD 已预编译支持 FreeType











