本文详解 codeigniter 中 ajax 请求返回 404 或 403 的常见原因,重点解决 url 路由配置、`.htaccess` 重写规则、csrf 防护及大小写敏感问题,并提供可直接运行的修复代码。
在 CodeIgniter 中通过 AJAX 调用控制器方法时出现 404 Not Found 或 403 Forbidden,是开发者高频踩坑场景。根本原因通常不是逻辑错误,而是 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 = '';
CodeIgniter 默认使用 index.php 作为入口文件(即使启用了伪静态,底层仍依赖它)。因此,不带 index.php 的 URL 会被 Web 服务器直接拒绝,返回 404。
? 修复方案(二选一):
url: BASE_URL + "index.php/quiz/get_item", // 注意:URL 中控制器名小写!
⚠️ 关键点: 控制器类名为 Quiz(首字母大写),但 URL 路由中必须小写(quiz),这是 CodeIgniter 的默认约定; 方法名 get_item 保持原样(无需驼峰转换)。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]$config['index_page'] = ''; // 清空 index_page $config['uri_protocol'] = 'AUTO'; // 或尝试 'REQUEST_URI'
✅ 启用后,URL 可简化为:BASE_URL + "quiz/get_item"
这极大概率是 CSRF 保护触发。CodeIgniter 3+ 默认开启 CSRF 防护,对 POST 请求强制校验 token。
? 解决方案(任选其一):
$config['csrf_protection'] = FALSE;
t_csrf_token_name(); ?>" value="security->get_csrf_hash(); ?>">
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);
}
});Quiz