根本原因是codeigniter 4默认关闭自动路由,所有url必须手动注册;需在routes.php中显式添加$routes->get('/home', 'home::index')并确保环境为development、.htaccess存在且正确、控制器文件名和类名大小写匹配。

新手在 CodeIgniter 4 中访问 /home 却收到 “404 - Can't find a route for 'get: home'” 错误,根本原因不是控制器写错了,而是框架压根没被告知该 URL 应该交给谁处理——CI4 默认关闭自动路由,所有路径都必须手动注册,漏写一行就彻底不可达。
先确认你的环境已准备就绪
打开终端,进入项目根目录,执行:php spark serve 启动内置服务器。若提示 Command "serve" is not defined,说明未安装或缓存损坏,立即运行 composer install 并清空缓存:php spark cache:clear。
检查 public/.htaccess 文件是否真实存在且内容完整(XAMPP/WAMP 环境下尤其容易被误删)。若缺失,复制官方默认内容:包含 RewriteEngine On 和两条 RewriteCond 判断,否则即使路由写对,/home 也会被 Apache 拦截为静态文件 404。
确保 .env 文件中 CI_ENVIRONMENT = development 已启用,否则错误不显示,你将永远不知道哪行路由没生效。
写第一条有效路由:让 /home 正常加载
打开 app/Config/Routes.php,找到 $routes->set404Override() 这一行,在它之前插入:
$routes->get('/home', 'Home::index');
这行代码告诉 CI4:当用户用 GET 方法请求 /home 这个 URL 时,调用 App\Controllers\Home 类的 index() 方法。注意大小写必须完全一致——Home 首字母大写,index 全小写;控制器文件名也必须是 Home.php,放在 app/Controllers/ 下。
保存后刷新浏览器访问 http://localhost/home。如果仍报 404,请立刻执行 php spark routes 查看当前已注册的所有路由列表,确认 /home 是否真实出现在输出中。
让根域名 / 直接打开首页
方法一:最简捷的首页映射
$routes->get('/', 'Home::index');
这行必须写在 /home 路由之前或之后均可,但绝不能被注释掉。很多新手删掉了这一行,导致访问 http://localhost/ 时直接 404,却误以为是路由系统坏了。
方法二:使用默认控制器(兼容性更强)
在 Routes.php 同一文件中,查找 $route['default_controller'] —— 注意!这是 CI3 的写法,在 CI4 中完全无效。CI4 不读这个变量,只认 $routes->get('/', ...) 这类显式声明。若你看到旧教程里还在用 $route['default_controller'] = 'home';,请立刻删除,否则可能干扰调试。
快速支持带参数的动态路径
第一步:匹配数字 ID,例如访问 /product/123 → 调用 Product::view(123)
$routes->get('/product/(:num)', 'Product::view/');
第二步:匹配任意字符串,例如 /blog/my-first-post → 调用 Blog::show('my-first-post')
$routes->get('/blog/(:any)', 'Blog::show/$1');
第三步:避免通配符吞噬静态路由——把 /product/(:num) 这类动态规则写在 /home、/about 等静态路由之后。因为 CI4 按代码顺序逐条匹配,一旦 (:any) 写在最前,/home 就永远无法命中。
注意:$1 是占位符捕获值的引用,不能写成 $2 或漏掉。若控制器方法签名是 public function view(int $id),CI4 会自动把 123 当作整型传入;若写成 view($id, $extra) 却只提供一个参数,将抛出致命错误。
验证路由是否真正生效
在终端执行:php spark routes
你会看到类似这样的输出:
+--------+----------+------------------+----------------------+
| Method | Route | Handler | Filter |
+--------+----------+------------------+----------------------+
| GET | / | Home::index | null |
| GET | /home | Home::index | null |
| GET | /product/(:num) | Product::view/$1 | null |
+--------+----------+------------------+----------------------+
只要 /home 出现在这个表格里,且 Method 是 GET,就证明路由已注册成功。此时若页面仍空白或报错,问题一定出在控制器逻辑或视图渲染环节,与路由配置无关。










