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

Laravel中AJAX指定POST却发送GET请求问题求助

解决Laravel中AJAX POST请求自动转为GET的问题

先还原下你的问题场景:

我在Laravel项目中遇到一个奇怪的问题:明明把路由定义成了POST方法,AJAX请求也指定了method: "POST",但实际请求该路由时却自动变成了GET请求。但如果把AJAX的URL指向一个未定义的路由,请求又会正常以POST发送。我的AJAX代码如下:

$.ajax({ 
    method: "POST", 
    url: "{{ url('admin/rentacar/save_availability_for_d') }}", 
    headers: { 
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
    }, 
    data: $(form).serialize(), 
    dataType: "json", 
    success(result){ 
        // 处理逻辑
    } 
})

这种问题我之前排查过好几次,大概率是下面几个原因之一,你可以逐个排查:

  • 路由重定向导致请求方法被转换
    最常见的情况是你的目标路由对应的控制器方法里返回了重定向(比如return redirect()->back()或者跳转到其他页面)。Laravel的302重定向会让浏览器自动把POST请求转为GET请求,这就会出现你看到的现象——访问已定义的POST路由时变成GET,而访问未定义的路由时因为没有重定向,POST请求正常发送。
    解决办法:打开对应的控制器方法,确认逻辑是否正确,应该直接返回JSON响应(比如return response()->json(['status' => 'success'])),而不是返回重定向。

  • 路由定义存在冲突
    检查你的routes/web.php(或者对应的路由文件)里,有没有重复定义了admin/rentacar/save_availability_for_d这个路径的GET路由。比如如果先定义了一个GET路由,后面再定义POST路由,可能会导致路由匹配异常。
    解决办法:运行php artisan route:list命令,查看所有已注册的路由,确保admin/rentacar/save_availability_for_d只有POST方法的路由,没有其他方法的同名路由。

  • 表单默认提交行为没被阻止
    如果你是在表单的submit事件里触发的AJAX请求,但忘记阻止表单的默认提交行为,那么浏览器会同时发送两个请求:一个是你写的AJAX POST,另一个是表单默认的GET提交(如果表单没指定method的话)。你在开发者工具里看到的GET请求可能是表单默认提交的那个。
    解决办法:在事件处理函数里加上event.preventDefault(),阻止默认行为:

    $('form').on('submit', function(event) {
        event.preventDefault(); // 必须加这行,阻止表单默认提交
        // 你的AJAX代码放在这里
        $.ajax({ 
            method: "POST", 
            url: "{{ url('admin/rentacar/save_availability_for_d') }}", 
            headers: { 
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
            }, 
            data: $(this).serialize(), 
            dataType: "json", 
            success(result){ 
                // 处理逻辑
            } 
        });
    });
    
  • URL末尾的斜杠引发重定向
    Laravel默认会对带斜杠的URL进行重定向(去掉斜杠),如果你的AJAX请求URL末尾加了斜杠,而路由定义里没有斜杠,就会触发302重定向,POST请求也会被转为GET。
    解决办法:用route()辅助函数生成URL会更可靠,避免手动写路径出错。先给你的POST路由起个名字:

    Route::post('admin/rentacar/save_availability_for_d', [YourController::class, 'handleSave'])->name('rentacar.save.availability');
    

    然后AJAX里的URL改成:

    url: "{{ route('rentacar.save.availability') }}"
    
  • 最后再确认下CSRF令牌(虽然你已经加了)
    虽然你在headers里携带了CSRF令牌,但可以再确认下页面里的meta标签是否正确,以及令牌值是否能被正确获取。比如打开开发者工具,查看请求头里的X-CSRF-TOKEN是否和页面meta标签里的一致。如果令牌无效,Laravel会返回419错误,但极少数情况下也可能引发异常行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:45:07