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

使用CodeIgniter 4的AJAX请求返回404错误,请求排查

问题分析与解决方案

你遇到的核心矛盾是POST请求返回404,但GET请求能正常获取数据,以下是最可能的原因和对应解决办法:

1. 路由仅支持GET方法,未配置POST权限

浏览器地址栏发起的是GET请求,能正常返回数据说明路由的GET配置是对的,但DataTable用的是POST请求,若后端路由只开放了GET方法,就会触发404。

解决办法:

  • 检查后端路由配置,确保目标接口允许POST请求。比如在Laravel中,把路由从Route::get()改成Route::post(),或者用Route::match(['get', 'post'], ...)同时支持两种请求方法:
    // Laravel示例:允许POST请求
    Route::post('/reports/ajaxopenwolist', [ReportController::class, 'ajaxopenwolist']);
    
    // 或者同时支持GET和POST
    Route::match(['get', 'post'], '/reports/ajaxopenwolist', [ReportController::class, 'ajaxopenwolist']);
    

2. 后端开启CSRF保护,AJAX POST未携带CSRF令牌

多数后端框架(如Laravel、Django)会对POST请求强制验证CSRF令牌,直接在地址栏发起GET请求不需要验证,但AJAX POST请求如果没带令牌,后端会拒绝请求,部分框架会返回404(或419状态码)。

解决办法:

  • 首先在页面头部添加CSRF令牌的meta标签(以Laravel为例):
    <meta name="csrf-token" content="{{ csrf_token() }}">
    
  • 然后在DataTable的AJAX配置中加入令牌,可通过headers或data参数传递:
    $("#tblReport").DataTable({
        dom: 'Bfrtip',
        buttons: ['copyHtml5', 'excelHtml5', 'pdfHtml5'],
        ajax: {
            url: '/reports/ajaxopenwolist',
            type: 'POST',
            // 方式1:通过请求头传递
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
            // 方式2:通过请求参数传递
            // data: {
            //     _token: $('meta[name="csrf-token"]').attr('content')
            // }
        }
    });
    

3. 额外排查点:URL路径解析问题

虽然你复制错误信息里的URL能访问,但仍需确认页面当前路径是否会导致相对URL解析错误(比如页面在/reports/detail下,相对路径可能被解析成/reports/detail/reports/ajaxopenwolist)。不过你已经使用了以/开头的绝对路径,这个概率较低,但可以通过浏览器开发者工具的Network面板查看实际请求的完整URL,确认是否和你手动访问的一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:25:33