codeigniter路由规则写错导致404需五步排查:一用php spark routes查注册路径与方法是否匹配;二检查通配符路由是否前置拦截;三验证url、控制器文件名、类名大小写严格一致;四确认apache/nginx重写规则正确且生效;五清空路由缓存并重启服务。

CodeIgniter路由规则写错后页面直接报404,但错误信息不提示具体哪条规则出问题,必须手动比对URL路径、控制器类名、命名空间和HTTP方法四者是否全部匹配——漏掉任一环,请求就卡在路由层,根本不会进控制器。
第一步:用命令行确认当前生效的路由列表
打开终端,进入项目根目录,执行:
php spark routes
这条命令会输出所有已注册的GET/POST等路由及其对应控制器方法。重点看两处:【你输入的URL路径是否完整出现在列表中】,以及【对应的控制器方法是否拼写正确,比如Home::index而不是home::index或Home::Index】。如果列表里压根没有 /home 这一行,说明路由没注册或被注释掉了;如果出现了但指向的是 WrongController::method,那就是手误写错了类名。
第二步:检查路由顺序是否被通配符拦截
打开 app/Config/Routes.php,从上往下逐行扫:
① 找到你写的那条路由,比如 $routes->get('/home', 'Home::index');
② 看它前面有没有类似 $routes->get('(:any)', 'Pages::view/$1'); 这样的通配符路由
③ 如果有,且这条通配符路由写在你的具体路由之前,那 /home 就永远匹配不到——因为 (:any) 会先吃掉所有路径,你的规则根本没机会执行。解决办法只有把具体路由挪到通配符之前,或者删掉干扰项。
这一步很多人跳过,直接改控制器,结果白忙活半天。
第三步:验证URL路径与控制器类名大小写是否严格一致
方法一:浏览器访问带 index.php 的原始路径
http://localhost/index.php/home → 能打开,说明控制器本身没问题;
http://localhost/home → 404,基本锁定是重写或路由问题。
方法二:检查控制器文件名与类名是否首字母大写
文件必须叫 app/Controllers/Home.php,不能是 home.php 或 HOME.PHP;
类定义必须是 class Home extends BaseController,不能是 class home 或 class HomeController。
【Linux服务器上home.php和Home.php是两个不同文件,部署后必然404】
第四步:确认Web服务器重写是否真正生效
Apache用户:检查 public/.htaccess 是否存在,且内容包含 RewriteRule ^(.*)$ index.php/$1 [L] —— 注意末尾的 /$1 不能写成 $1,缺斜杠会导致URI段丢失,/home 变成 /index.php?uri=home,CI4收不到原始路径。
Nginx用户:检查 server 块里是否有 try_files $uri $uri/ /index.php?$query_string; 这一行,且 root 指向的是 public 目录,不是项目根目录。
这一步不验证,光改 routes.php 是徒劳的。
第五步:清空路由缓存并重启服务
执行:
php spark cache:clear
再执行:
php spark serve --no-interaction
CI4会缓存 routes.php 编译后的字节码,改完路由不清理缓存,旧规则还在跑。serve 命令启动内置服务器可绕过Apache/Nginx配置干扰,快速验证纯框架逻辑是否通。










