Laravel 8 中GET请求的reCAPTCHA表单验证失效问题排查
异常根因
你碰到的提交后直接跳主页、reCAPTCHA校验完全不生效的问题,根本不是GET请求和当前使用的no-captcha扩展包不兼容,是两个逻辑叠加把问题表象掩盖了:
- Laravel的FormRequest类在校验失败时,会自动生成重定向响应,默认跳转逻辑是回到请求来源页。当来源路径因为会话历史、路由匹配规则解析异常时,就会直接跳到站点根路径,导致你看不到任何校验错误提示,误以为自定义校验逻辑压根没运行
- 之前试过把ListadoRequest换成基础Request就能正常访问查询逻辑,本质是基础Request不会自动触发校验失败的重定向,不是reCAPTCHA规则本身失效
落地修复步骤
1. 修正FormRequest的重定向逻辑,固定跳转目标
在ListadoRequest类中重写重定向规则,不要让框架自动推断跳转路径,直接固定回查询表单页,同时把输入值、校验错误带回页面,避免出现无提示跳主页的问题,参考代码:
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class ListadoRequest extends FormRequest { public function authorize() { return true; } public function rules() { return [ 'texto' => 'required', 'g-recaptcha-response' => 'required|captcha', ]; } // 固定校验失败后的跳转地址 protected function getRedirectUrl() { return route('busqueda'); } // 自定义校验失败的响应,保留表单输入值和错误提示 protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator) { throw new \Illuminate\Validation\ValidationException( $validator, $this->redirect($this->getRedirectUrl()) ->withErrors($validator) ->withInput() ); } }
2. 确认GET表单的参数传递正常
打开浏览器开发者工具的网络面板,提交表单时检查两个核心点:
- 确认请求URL的查询参数中包含
texto对应的查询文本值 - 确认请求参数中存在
g-recaptcha-response字段,且值不为空。如果字段缺失,大概率是reCAPTCHA脚本加载失败,或者表单提交时还未完成人机校验生成有效token
3. 校验扩展包配置正确性
检查项目根目录的.env文件,确认reCAPTCHA的站点公钥、服务端密钥值和对应域名下的配置完全匹配,不要把测试环境的密钥用到生产环境,也不要留空配置值。
最终验证
修复完成后提交表单,正常逻辑应该符合以下预期:
- 不完成人机校验直接提交:重定向回查询表单页,提示
g-recaptcha-response字段为必填 - 人机校验token无效:提示校验不通过,无法进入查询逻辑
- 全部校验通过:正常进入查询结果页,显示对应检索内容
注意:GET提交方式完全不需要调整成POST,reCAPTCHA生成的token支持通过URL查询参数传递,不影响原有查询页的URL分享、收藏功能。
内容的提问来源于stack exchange,提问作者Pamela Rojas
相关产品推荐
相关产品推荐

