CI4路由必须显式声明,否则访问如/home必报404;因默认禁用自动路由,需在Routes.php中用$routes->get('/home', 'Home::index')等链式语法明确定义,且路径含前导/、方法名小写、类名首字母大写。

CI4 路由必须显式声明,否则 404 是必然结果
CI4 默认关闭自动路由($routes->setAutoRoute(false)),哪怕你写了 app/Controllers/Home.php 并定义了 index() 方法,访问 /home 依然报错:404 - Can't find a route for 'get: home'。这不是配置漏了,是设计如此——CI4 要求你亲手把每个 URL 映射到控制器方法。
实操建议:
- 打开
app/Config/Routes.php,在$routes->set404Override()之前添加:$routes->get('/home', 'Home::index'); -
/home是浏览器输入的完整路径(含前导/),不是文件名或类名片段 -
Home::index中的Home不带命名空间前缀,框架会自动按App\Controllers\解析 - 大小写敏感:类名首字母大写(
Home.php→class Home),方法名小写(index())
CI4 路由语法和 CI3 完全不兼容,不能直接迁移
CI3 的 $route['home'] = 'home/index'; 在 CI4 里完全无效,连解析都过不了。CI4 使用链式调用 + 字符串标识符,且动词(get、post)必须明确指定。
常见错误场景:
- 照搬 CI3 写法:
$route['product/(:num)'] = 'product/view/$1';→ 直接报 PHP 语法错误或路由不生效 - 漏写 HTTP 方法:
$routes->add('/home', 'Home::index');已废弃,CI4 不再支持add(),必须用get()、post()等具体方法 - 路径没加前导
/:$routes->get('home', ...)→ 匹配的是空路径 + 字符串home,实际请求/home不会命中 - 动态参数写错:
$routes->get('/product/(:num)', 'Product::view/$1');中的$1是旧写法,CI4 正确写法是Product::view/$1仅用于向后兼容,推荐用闭包或命名参数:$routes->get('/product/(:num)', ['controller' => 'Product', 'method' => 'view']);
CI4 路由顺序和缓存影响真实行为
CI4 路由按代码顺序匹配,先定义的规则优先。如果你在文件末尾加了通配符路由(比如 $routes->get('(:any)', 'Page::show');),那前面所有静态路由都会被跳过。
另外,CI4 会缓存路由配置,改完 Routes.php 后不清理缓存,新规则不会生效。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
必须执行的验证步骤:
- 运行
php spark routes查看当前已注册的所有有效路由,确认/home是否在列表中 - 执行
php spark cache:clear清掉路由缓存(包括Writable/Cache和 OPcache) - 检查 Apache 是否启用
mod_rewrite,且public/.htaccess文件存在并生效;否则即使路由写了,/home也会被当成静态路径返回 404 - 确保 Web 服务器根目录指向
public/,而不是项目根目录或app/—— 否则重写规则根本没机会触发
CI4 的 Base URL 配置错误会导致路由“看似生效实则失败”
路由能匹配、控制器能执行、视图也能渲染,但 CSS/JS 图片全 404?大概率是 app/Config/App.php 里的 $baseURL 没设对。
CI4 不再读 $config['base_url'],而是依赖这个属性:
public $baseURL = 'http://localhost/';
常见坑点:
- 写成
'http://localhost/myapp/'或'http://localhost/myapp/public/'→ 所有资源路径多一层前缀,404 - 留空或只写
'/'→ 在非根域名下(如http://localhost/crm)时,资源路径变成//css/app.css,协议相对路径失效 - 开发环境用
http://localhost,生产环境却忘了改成正式域名 → 静态资源跨域或 404
真正容易被忽略的是:这个值不仅影响资源加载,还参与生成重定向 URL、表单 action、CSRF token 签名等——错一点,整个请求链就断在中间环节,错误表现五花八门,但根源往往就在这行配置。


















