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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 14:54:04