mews/captcha安装后不生效需手动发布配置、注册路由并确保session正常;默认math驱动易被误判,验证码路由须置于所有路由之前且避免中间件拦截,验证失败多因session失效或字段名不匹配。

composer require mews/captcha 安装后不生效?
不是装完就能用,mews/captcha 默认不自动注册服务提供者(Laravel 5.5+ 也需手动确认),且配置文件不会自动生成。
- 运行
php artisan vendor:publish --provider="Mews\Captcha\CaptchaServiceProvider"才会生成config/captcha.php - Laravel 9+ 若启用了 Package Discovery,仍需检查
config/app.php中是否残留旧版providers手动注册项,冲突会导致配置不加载 -
captcha.php里默认的default驱动是math(算术题),不是图形验证码,容易误以为“没显示”
验证码图片返回 404 或空白?
路由未正确声明或中间件拦截是主因,mews/captcha 的图片 URL 是通过路由生成的,不是静态资源。
- 确保已添加路由:在
routes/web.php中写Route::get('captcha/{config?}', 'CaptchaController@captcha')->name('captcha');(注意:它不自带控制器,需自己建) - 更稳妥的做法是直接用包内置的路由:在
routes/web.php加Route::captcha();—— 这行会注册/captcha/{config?},但必须放在所有其他路由之前,否则被 catch-all 路由吞掉 - 如果用了
auth中间件或其他全局中间件(如语言检测、权限校验),可能提前终止响应,导致图片流被截断,建议对验证码路由加->withoutMiddleware(...)
表单提交时 validate('captcha') 总失败?
验证失败通常不是逻辑错,而是 session 或字段名不匹配。
-
captcha字段默认走的是 session 存储,必须确保当前请求 session 已启动且未失效;Laravel 8+ 使用cookiesession 驱动时,若域名带 www 或 http/https 混用,session_id 可能不一致 -
前端 input 的
name必须严格为captcha,不能是captcha_code或带前缀,否则$request->validate(['captcha' => 'required|captcha'])找不到值 - 验证规则
captcha本质是调用CaptchaService::check(),它会从 session 读取上一次生成的 hash 值比对,如果页面刷新后没重新加载验证码图片(即没触发新/captcha请求),session 里的旧值已被清空,必然失败
如何切换成中文数字或自定义字体?
默认字体不支持中文,强行传中文字符串会出方块或报 GD 错误,必须换字体文件并改配置。
- 下载一个支持中文的 TTF 文件(如
simhei.ttf),放到public/fonts/下 - 修改
config/captcha.php中对应配置项:'fonts' => ['public/fonts/simhei.ttf'](注意路径是 web root 相对路径) - 若用
custom驱动,需自己实现generate()方法,把mt_rand(1000, 9999)换成中文数字数组随机取,例如['零','一','二','三'],再用imagettftext()绘制 - GD 库必须启用
freetype支持,Ubuntu 下装php-gd后还需确认gd.jpeg_ignore_warning和gd.freetype在 php.ini 中为 On










