必须显式配置路由,ci4不自动扫描控制器;需在routes.php中添加$routes->get('/home','home::index'),并确保public为web根目录、mod_rewrite已启用。

访问 /home 却提示 404 - Can't find a route for 'get: home',不是控制器文件写错了,而是框架根本没看到你的路由声明——CI4 不会自动扫描控制器,所有路径必须显式注册,漏掉任意一环都会卡在“找不到控制器”这一步。
确认控制器文件与命名空间是否合法
打开 app/Controllers/Home.php,检查类定义是否完全符合 CI4 规范:
第一行必须是 namespace App\Controllers;,不能省略或写成 App\Controlles(少个 r);
类名必须严格匹配文件名,即 class Home extends BaseController,首字母大写、无下划线、不带 .php 后缀;
【文件名 Home.php 与类名 Home 必须完全一致,大小写敏感,Windows 下可能掩盖问题,Linux 服务器上直接报错】;
确保该文件中至少有一个可公开访问的方法,例如 public function index(),且未被 private 或 protected 修饰。
验证路由是否已写入且位置正确
编辑 app/Config/Routes.php,找到 $routes 实例作用区域(通常在 if (is_cli() === false) 块内);
在 $routes->set404Override() 之前添加路由语句,顺序很重要:通配符路由(如 $routes->get('(:any)', ...))必须放在具体路由之后,否则 /home 会被提前捕获并失败;
写入标准 GET 路由:$routes->get('/home', 'Home::index');,注意路径开头必须带 /,控制器方法用双冒号连接,中间无空格;
若你改过默认首页路由 $routes->get('/', 'Home::index');,请确认它没被注释或误删——否则连根路径都打不开,容易误判为控制器问题。
清除路由缓存并实时验证
CI4 默认启用路由缓存,修改 Routes.php 后不会立即生效;
执行命令清空缓存:php spark cache:clear;
再运行 php spark routes 查看当前已加载的全部有效路由;
在输出列表中搜索 GET | /home,如果没出现,说明路由未被识别——此时回到上一步检查语法或文件编码(BOM 头会导致解析失败);
如果出现但仍是 404,请跳转到下一环节检查 Web 根目录配置。
检查 public/ 目录是否为 Web 服务器真实根目录
Apache 配置中,DocumentRoot 必须指向项目内的 public/ 目录,例如 XAMPP/htdocs/myapp/public;
若错误指向 myapp/ 或 myapp/app/,请求根本无法进入 CI4 入口文件 public/index.php,直接返回 Apache 404,此时框架甚至没启动,自然不读路由;
验证方式:在浏览器访问 http://localhost/public/index.php,若显示 CI4 欢迎页,说明根目录设错;若提示“Not Found”,说明 public/ 确实是 Web 根目录,问题仍在代码层。
排查 .htaccess 是否生效
方法一:临时在 URL 中补全 index.php,访问 http://localhost/index.php/home;
若此时能正常显示,说明 Apache 的 mod_rewrite 未启用或 .htaccess 被忽略;
检查 public/.htaccess 文件是否存在且内容完整(含 RewriteEngine On 及标准重写规则);
检查 Apache httpd.conf 中对应目录段落是否设置 AllowOverride All,而非 None;
【XAMPP 用户常在此处踩坑:默认 httpd.conf 中 DocumentRoot 下的










