codeigniter 4 必须显式配置路由才能访问控制器,因默认关闭自动路由;需在 app/config/routes.php 中添加如 $routes->get('/home', 'home::index'),且路径、类名、方法名大小写必须严格匹配。

CodeIgniter 路由配置写对了,才能让 URL 正确找到控制器和方法。核心不是“怎么写好看”,而是“怎么写才被框架识别”——CI4 默认不自动映射 URL 到控制器,必须显式声明;CI3 虽支持自动路由,但自定义规则仍需手动配置,否则容易被覆盖或忽略。
CI4 必须显式注册路由
即使你已创建 app/Controllers/Home.php 并写了 public function index(),访问 /home 仍会 404。原因:CI4 默认关闭自动路由($routes->setAutoRoute(false))。必须在 app/Config/Routes.php 中添加:
-
$routes->get('/home', 'Home::index');→ 访问http://localhost/home触发Home类的index()方法 -
$routes->get('/', 'Home::index');→ 设置首页,访问根路径即可加载 - 方法名区分大小写:
Home::Index或home::index都无效,必须是Home::index
CI3 路由写法更简洁但要注意约定
CI3 使用 $route 数组,语法更直白,但控制器名必须小写(即使类名首字母大写):
-
$route['home'] = 'home/index';→application/controllers/Home.php中类名为Home,方法为index() -
$route['product/(:num)'] = 'products/view/$1';→/product/123映射到Products::view(123) -
$route['default_controller'] = 'welcome';→ 确保Welcome.php存在且含index()方法
动态路由要控制匹配顺序
通配符路由(如 (:any)、(:num))很灵活,但放错位置就会“吃掉”其他规则:
- 把具体路由写在前面:
$routes->get('/admin/login', 'Admin::login'); - 再写通用路由:
$routes->get('(:any)', 'Frontend::page/$1'); - 如果反过来,
/admin/login就永远进不了 Admin 控制器,直接被(:any)捕获
别漏掉基础环境配置
路由写对了,但访问还报 404?大概率是底层没跑通:
- Web 根目录必须指向
public/(CI4)或项目根目录(CI3),不能是app/或system/ - CI4 的
app/Config/App.php中public $baseURL = 'http://localhost/';必须正确,不能带/public/或留空 - 确认 Apache 的
mod_rewrite已启用,且public/.htaccess文件存在并生效;Nginx 用户需配置try_files - 执行
php spark cache:clear和php spark routes查看当前生效的全部路由,验证是否注册成功










