codeigniter 404主因是路由未接通:先验证index.php访问是否正常,再检查重写规则、url小写/类名首字母大写/方法名小写三者严格匹配,确认routes.php显式路由与控制器文件名、类名、方法名及命名空间完全一致,关闭自动路由避免冲突。

CodeIgniter控制器方法路由对应不上,访问时直接报404或跳转到默认页,不是代码写错了,而是URL段、类名、方法名三者之间有一处没对齐——哪怕只错一个字母大小写,框架就拒绝匹配。
先确认请求是否进了框架
在浏览器中直接访问 http://localhost/index.php/welcome(注意带 index.php),能打开欢迎页;但访问 http://localhost/welcome 就 404?说明Web服务器重写规则没生效,请求根本没交给CodeIgniter处理,后续所有路由配置都白搭。
Apache用户检查 public/.htaccess 是否存在且含这两行:RewriteCond %{REQUEST_FILENAME} !-f 和 RewriteCond %{REQUEST_FILENAME} !-d,再看 RewriteRule ^(.*)$ index.php/$1 [L] 中的 /$1 斜杠不能丢;Nginx用户必须在server块里写 try_files $uri $uri/ /index.php?$query_string;。
查URL路径与路由定义是否一致
打开 app/Config/Routes.php,找到你写的那条路由,比如:
$routes->get('/user/profile', 'User::profile');
对照浏览器地址栏:URL必须是 全小写 的 /user/profile,不能是 /User/Profile 或 /USER/PROFILE;【'User::profile' 中的 User 首字母必须大写,profile 必须小写】,类名和方法名大小写不匹配,CI4直接忽略这条路由。
如果用的是资源路由:$routes->resource('posts');,它会自动生成7条标准CRUD路由,但不会生成 /posts/create 这种带动词的路径——那是CI3风格,CI4里得手动加:$routes->get('/posts/create', 'Posts::create');。
验证控制器文件、类名、方法是否存在且可访问
第一步:确认文件路径是 app/Controllers/User.php,不是 user.php 或 UserController.php;
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
第二步:打开该文件,检查类定义是否为 class User extends BaseController,不能是 class user 或 class UserController;
第三步:检查方法是否为 public function profile(),不能是 private function profile(),也不能是 public function Profile()(首字母大写)——CI4只认小写方法名;
第四步:若方法带参数,如 public function view($id),路由中必须显式传参:$routes->get('/user/view/(:num)', 'User::view/$1');,【$1 不能漏,否则参数无法注入】。
排查自动路由干扰
CI4默认关闭自动路由:$routes->setAutoRoute(false);。如果你在 Routes.php 顶部手动打开了它:$routes->setAutoRoute(true);,那框架会尝试把 /user/profile 映射到 User::profile() ——但前提是URL小写、类名首字母大写、方法名小写三者全部合规,且该方法是public。
更危险的是:你在启用自动路由的同时,又写了显式路由 $routes->get('/user/profile', 'User::show');,结果 /user/profile 被自动路由抢走,指向了 User::profile(),而你本意是让它走 User::show() ——这时删掉 setAutoRoute(true),只留显式路由最稳妥。
检查 .env 和 App.php 中的基础配置
打开 .env 文件,确认 CI_ENVIRONMENT = development,否则错误不显示,你只能看到空白页或通用404;
打开 app/Config/App.php,检查 public $baseURL = 'http://localhost/'; ——必须以斜杠结尾,不能是 'http://localhost' 或 'http://localhost/crm/public/';
再看 app/Config/Constants.php 中的 APP_NAMESPACE 是否为 'App',改错会导致命名空间解析失败,控制器根本加载不了。










