
本文详解 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。
? 修复方案(二选一):
✅ 方案一:显式包含 index.php(快速验证)
url: BASE_URL + "index.php/quiz/get_item", // 注意:URL 中控制器名小写!
⚠️ 关键点: 控制器类名为 Quiz(首字母大写),但 URL 路由中必须小写(quiz),这是 CodeIgniter 的默认约定; 方法名 get_item 保持原样(无需驼峰转换)。
✅ 方案二:启用 URL 重写(推荐生产环境)
- 确保 Apache 启用 mod_rewrite;
- 在项目根目录添加 .htaccess:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L] - 修改 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










