CodeIgniter控制器返回404通常因请求未抵达控制器:URL拼写错误(如BASE_URL缺斜杠)、Apache/Nginx重写规则未配置导致index.php被拦截、CI4路由文件位置错误(应为app/Config/Routes.php)、控制器方法非public或大小写不匹配、Nginx缺失PATH_INFO配置。

CodeIgniter控制器返回404,绝大多数情况不是代码写错了,而是请求根本没走到控制器——URL没被正确解析、路由没匹配上、或框架压根没加载到你的控制器文件。
URL路径拼错:BASE_URL缺斜杠 or index.php漏了
JS里用 BASE_URL + "quiz/get_item" 发请求,如果 BASE_URL 输出是 http://localhost/myapp(没尾部斜杠),拼出来就是 http://localhost/myappquiz/get_item,直接 404。Apache 下若没配好 .htaccess,不带 index.php 的 URL 会被 Web 服务器拦截,连 CI 入口都进不去。
- 检查 JS 中
console.log(BASE_URL)输出,确保以/结尾;不行就手动补:var BASE_URL = '<?php echo rtrim(base_url(), "/") . "/"; ?>'; - 临时验证:把 AJAX 的
url改成BASE_URL + "index.php/quiz/get_item",注意控制器名小写(quiz),方法名保持原样(get_item) - 生产环境别留
index.php,必须配好 .htaccess 或 Nginx 的重写规则
路由配置失效:文件位置错 or 通配符过时
CI4 的 routes.php 必须放在 app/Config/Routes.php,放错位置(比如还留在 application/config/)会导致所有自定义路由静默失效,访问任何非首页路径都是 404,且无提示。
- CI3 升级到 CI4 后,旧路径
application/config/routes.php完全无效,必须迁移到app/Config/Routes.php - CI3 升级后,
(:any)不再匹配含斜杠的路径(如api/v1/users),得换成(.+)或显式正则 - 运行
php spark routes看输出里有没有你写的路由;没有,先别调控制器,去查文件路径和命名
控制器或方法不可见:大小写、权限、缓存三重陷阱
CI 对控制器类名、方法名严格区分大小写。URL 访问 quiz/get_item,但控制器文件叫 Quiz.php(类名 Quiz)没问题,方法却写成 Get_item() 或 private function get_item(),就会 404——框架找不到可执行的 public 方法。
- 控制器方法必须声明为
public function get_item(),不能是private或protected - CI4 中控制器类名需与文件名完全一致(
User.php→class User),URL 路由里的类名也得小写(user/profile) - 改完控制器或路由后,一定要清缓存:
php spark cache:clear(CI4)或删writable/cache/(CI3)
Nginx 下 PATH_INFO 丢失:URL能访问但参数全空
在 Nginx 上,/user/profile 返回 404,但 /index.php/user/profile 能通,基本就是 Nginx 没把原始路径传给 PHP。CI 默认靠 PATH_INFO 解析路由段,Nginx 不配置就不会生成它。
- 确认
application/config/config.php中$config['uri_protocol'] = 'PATH_INFO'(或试'REQUEST_URI') - Nginx 配置里必须有
fastcgi_split_path_info ^(.+\.php)(/.+)$;和fastcgi_param PATH_INFO $fastcgi_path_info; - 漏掉
try_files $uri $uri/ /index.php?$query_string;也会导致静态资源误判为 404
真正卡住的地方,往往是你以为请求进了控制器,其实它连入口文件都没触达。先看 Network 面板里请求发到了哪个 URL,再比对 php spark routes 输出和服务器实际重写规则,比盯着控制器方法改拼写更省时间。


















