CodeIgniter AJAX 404/403 错误的完整解决方案

CodeIgniter AJAX 404/403 错误的完整解决方案

本文详解 codeigniter 中 ajax 请求返回 404 或 403 的常见原因,重点解决 url 路由配置、`.htaccess` 重写规则、csrf 防护及大小写敏感问题,并提供可直接运行的修复代码。

在 CodeIgniter 中通过 AJAX 调用控制器方法时出现 404 Not Found 或 403 Forbidden,是开发者高频踩坑场景。根本原因通常不是逻辑错误,而是 URL 构建方式与服务器路由机制不匹配 所致。

? 问题定位:先验证 BASE_URL 输出

在你的 JS 中加入调试语句:

console.log(BASE_URL); // 检查是否以斜杠结尾(如 http://localhost/myapp/)

若输出为 http://localhost/myapp(无尾部 /),则拼接 BASE_URL + “Quiz/get_item” 会变成 http://localhost/myappQuiz/get_item —— 显然路径错误,导致 404。

✅ 正确做法:确保 base_url() 返回带尾斜杠的完整地址,或手动补全:

var BASE_URL = '';

? 为什么 Quiz/get_item 404?—— CodeIgniter 默认 URL 格式

CodeIgniter 默认使用 index.php 作为入口文件(即使启用了伪静态,底层仍依赖它)。因此,不带 index.php 的 URL 会被 Web 服务器直接拒绝,返回 404。

? 修复方案(二选一):

知识吐司

知识吐司

专注K12教育的AI知识漫画生成工具

下载

✅ 方案一:显式包含 index.php(快速验证)

url: BASE_URL + "index.php/quiz/get_item", // 注意:URL 中控制器名小写!

⚠️ 关键点: 控制器类名为 Quiz(首字母大写),但 URL 路由中必须小写(quiz),这是 CodeIgniter 的默认约定; 方法名 get_item 保持原样(无需驼峰转换)。

✅ 方案二:启用 URL 重写(推荐生产环境)

  1. 确保 Apache 启用 mod_rewrite;
  2. 在项目根目录添加 .htaccess:
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]
  3. 修改 application/config/config.php:
    $config['index_page'] = ''; // 清空 index_page
    $config['uri_protocol'] = 'AUTO'; // 或尝试 'REQUEST_URI'

    ✅ 启用后,URL 可简化为:BASE_URL + “quiz/get_item”

?️ 为什么改成 index.php/quiz/get_item 后报 403?

这极大概率是 CSRF 保护触发。CodeIgniter 3+ 默认开启 CSRF 防护,对 POST 请求强制校验 token。

? 解决方案(任选其一):

  • 临时关闭 CSRF(仅开发阶段)
    application/config/config.php 中设:

    $config['csrf_protection'] = FALSE;
  • 正确传递 CSRF Token(推荐)
    在视图中输出 token(需在控制器中启用):

    AJAX 请求中带上:

    $.ajax({
        url: BASE_URL + "index.php/quiz/get_item",
        type: "POST",
        dataType: "json",
        data: {
            security->get_csrf_token_name(); ?>: $('#csrf_token').val()
        },
        success: function(data) {
            console.log(data);
        }
    });

✅ 完整修复后的 View 代码(含 CSRF 支持)

Quiz

https://www.php.cn/faq/2031761.html

发表回复

Your email address will not be published. Required fields are marked *