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

CodeIgniter 3.1.8中使用Ajax+DataTables遇403错误求助

解决CodeIgniter 3.1.8 + DataTables Ajax 403错误的方案

我之前在CodeIgniter里用DataTables做服务端渲染时,也踩过这个403的坑。结合你的代码和描述来看,核心问题大概率是CSRF令牌没有正确传递到Ajax请求中——毕竟CI默认开启了CSRF保护,所有POST请求必须带上对应的令牌参数,哪怕你把$config['csrf_regenerate']设为false也没用,因为只是不刷新令牌,但还是要传。

下面是具体的解决步骤:

1. 确认CI的CSRF配置

先打开application/config/config.php,确认这几个配置项(默认值如下,你可以根据自己的修改调整):

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name'; // POST请求中要带的参数名
$config['csrf_cookie_name'] = 'csrf_cookie_name'; // 存储令牌的cookie名
$config['csrf_regenerate'] = FALSE; // 你已经设置过这个了

2. 修改DataTables的Ajax配置,传递CSRF令牌

有两种可靠的方式把令牌加到请求里:

方式一:直接在请求数据中注入令牌

利用DataTables的data回调函数,把CI生成的CSRF名称和值直接加到POST参数里:

$('#Table').DataTable({
    "processing": true,
    "serverSide": true,
    ajax: {
        url: '<?= base_url('myController/data');?>',
        "type": "POST",
        "data": function(d) {
            // 把CSRF令牌添加到请求参数中
            d['<?= $this->security->get_csrf_token_name();?>'] = '<?= $this->security->get_csrf_hash();?>';
        }
    },
    "columns": [
        { "data": "col1" },
        { "data": "col2" },
        { "data": "col3" }
    ]
});

方式二:从Cookie中读取令牌(更灵活)

CI会把CSRF令牌同时存在Cookie里,你可以用jQuery读取Cookie并加到请求头或参数中,适合需要动态获取令牌的场景:

$('#Table').DataTable({
    "processing": true,
    "serverSide": true,
    ajax: {
        url: '<?= base_url('myController/data');?>',
        "type": "POST",
        "beforeSend": function(xhr) {
            // 从Cookie获取CSRF令牌
            var csrfToken = getCookie('<?= $config['csrf_cookie_name'];?>');
            // 方式A:加到请求头
            xhr.setRequestHeader('X-CSRF-Token', csrfToken);
            // 方式B:直接加到请求参数
            // this.data()[<?= $this->security->get_csrf_token_name();?>] = csrfToken;
        }
    },
    "columns": [
        { "data": "col1" },
        { "data": "col2" },
        { "data": "col3" }
    ]
});

// 辅助函数:获取指定Cookie的值
function getCookie(name) {
    var value = "; " + document.cookie;
    var parts = value.split("; " + name + "=");
    if (parts.length == 2) return parts.pop().split(";").shift();
}

3. 额外排查点

如果还是报403,再检查这两个地方:

  • 控制器方法权限:确认myController的data方法没有被权限拦截(比如你用了Auth库,有没有允许该方法的POST访问?或者构造函数里有没有排除CSRF验证?)
  • URL正确性:在浏览器控制台的Network面板里,查看Ajax请求的URL是否正确,有没有拼写错误导致的404(不过403是权限问题,这个概率低,但可以排除)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:57:40