You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel集成Google RecaptchaV3后本地环境表单验证错误不显示

问题根因

该问题完全由本地环境的会话存储配置触发:

  1. 本地使用SESSION_DRIVER=cookie配置,Laravel会把所有会话数据(包括验证失败产生的$errors错误信息、表单旧输入闪存数据)全部存储在客户端Cookie中
  2. Google RecaptchaV3返回的token本身长度达数百字符,加上多字段验证错误的提示内容、所有表单旧输入值,最终导致整个Cookie的总大小超过了浏览器规定的4096字节上限,浏览器直接忽略了服务端返回的Set-Cookie响应头,验证失败的闪存数据没有被写入Cookie,页面刷新后自然读不到$errors变量
  3. 线上环境使用SESSION_DRIVER=memcached,会话数据全部存在服务端,Cookie仅存储长度极短的会话ID,不存在长度超限问题,因此运行正常

解决方案

方案1:修改本地会话驱动(最推荐)

直接修改本地.env文件的会话驱动配置,改用服务端存储的驱动即可,无需修改业务代码:

# 把原来的SESSION_DRIVER=cookie改成file即可,也可以用redis等其他驱动
SESSION_DRIVER=file

修改后执行php artisan config:clear清空配置缓存,重启服务即可生效。该方案和线上环境的运行逻辑一致,不会出现本地/线上行为不一致的问题。

方案2:精简闪存数据(若必须使用cookie驱动)

如果本地一定要用cookie驱动,可以重写注册逻辑的验证失败处理,排除不需要闪存的字段减少Cookie体积:

public function register(Request $request) {
    $validator = $this->validator($request);

    if ($validator->fails()) {
        // 排除不需要回显的captcha字段,减少存储体积
        $request->flashExcept('g-recaptcha-response');
        throw new \Illuminate\Validation\ValidationException($validator);
    }

    event(new Registered($user = $this->create($request->all())));
    // 原有后续逻辑
}

方案3:本地开发关闭验证码验证

本地开发阶段可以新增配置开关直接跳过Recaptcha验证,避免token占体积:
首先在.env新增配置:

CAPTCHA_ENABLE=false

然后修改验证规则:

'g-recaptcha-response' => config('app.captcha_enable') ? ['required', new CaptchaV3($request->ip(), 'register')] : [],

线上环境把CAPTCHA_ENABLE设为true即可正常开启验证。


内容的提问来源于stack exchange,提问作者Nite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 19:27:03