thinkphp6启用captcha需五步:安装think-captcha扩展、启用session中间件、配置config/captcha.php、注册captcha路由、模板调用{:captcha_img()}或captcha_src()并校验;缺一则失败。

ThinkPHP6 里怎么启用 captcha 服务
默认安装的 ThinkPHP6 不带验证码功能,得手动装扩展。不装包直接调用 Captcha 类会报错:Class "think\captcha\Captcha" not found。
执行这条命令安装官方维护的验证码扩展:
composer require topthink/think-captcha
装完后无需手动注册服务提供者,框架会自动识别并加载。但注意:如果项目启用了多应用模式(app/multi.php 开启),需确认当前应用的配置目录下有 captcha.php 配置文件(一般由扩展自动发布到 config/captcha.php)。
captcha 路由没生效?检查是否漏配中间件
TP6 默认关闭了 captcha 的内置路由,必须显式注册。常见错误是只写了控制器方法,却没配路由,访问 /captcha 直接 404。
在 route/app.php 里加一行即可(推荐放在最外层路由组,避免被其他中间件拦截):
use think\captcha\facade\Captcha;
Route::get('captcha/:id?', [Captcha::class, 'show']);
或者更稳妥的方式——用闭包路由,避开类自动加载风险:
Route::get('captcha/:id?', function ($id = null) { return captcha_show($id); });
如果项目用了全局中间件(比如权限校验),要确保该路由不经过这些中间件,否则可能因未登录被重定向,导致图片加载失败。
首页模板里怎么写 {:captcha_img()} 才不出错
{:captcha_img()} 是最简写法,但它依赖两个前提:一是路由已注册且可访问,二是前端能正常发起 GET 请求。实际中常遇到图片空白、控制台报 500 或跨域问题。
建议改用显式 URL + 随机参数防缓存:
- 用
url()助手生成带时间戳的地址:<img src="<?=%20url('captcha',%20['time'%20=>%20time()])%20?>" onclick="this.src='<?= url('captcha', ['time' => time()]) ?>&t='+Math.random()" alt="captcha"> - 确保模板所在控制器没禁用输出(比如写了
$this->success()后又输出 HTML) - 如果首页是静态 HTML 或前后端分离项目,不能直接用模板标签,得走 AJAX 获取 base64 图片或单独接口返回图片流
为什么点不动、刷新无效、总提示“验证码错误”
核心原因几乎都出在 Session 上。TP6 默认用 file 驱动存 session,但如果 runtime/session 目录不可写,或 PHP 配置禁用了 session(session.auto_start=Off 且没手动 session_start()),验证码就无法比对。
检查项列表:
- 运行
php -i | grep session.save_path确认 session 路径存在且 webserver 用户有写权限 - 查看
config/app.php中'default_return_type' => 'html'是否被改成json,这会导致验证码图片响应头异常 - 表单提交时,
captcha字段名必须和验证规则一致,默认是captcha,别写成verify或code却不改验证规则 - 如果用了 Redis 存 session,确认
config/cache.php里的 Redis 连接配置正确,否则验证码生成和验证用的 session 数据根本不在同一个存储里
验证码逻辑本身极轻量,但依赖链很短——只要 session 断一环,整个流程就静默失败。调试时优先看 Network 面板里 /captcha 响应是否为 200 + image/png,再查 session_id 是否前后一致。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











