ci4自动路由开启后大小写敏感,导致/home与/home均可访问,形成双入口隐患;不支持中间件绑定、参数约束及优先级设置;仅扫描app\controllers\根命名空间,子命名空间控制器直接404且无提示;迁移ci3项目时类名大小写不匹配将被跳过。

自动路由开启后大小写敏感导致重复入口
CI4默认关闭自动路由,但一旦设为$routes->setAutoRoute(true),它只按类名和方法名“原样匹配”——Home::index对应/home,HOME::INDEX对应/HOME,两者都可访问。这不是功能,是隐患:搜索引擎可能收录两个URL,管理后台的登录态校验若没做统一重定向,就等于开了双入口。
无法绑定中间件或参数约束
自动路由不支持任何附加控制逻辑。你想对/admin/*加auth过滤器?不行。想限制/user/(:num)里的ID必须是数字?也不行。所有这些都得退回到显式路由声明:$routes->get('/user/(:num)', 'User::show/$1')->addFilter('auth');。自动路由生成的路径连->setPriority()都不认。
命名空间错位直接404且无提示
CI4自动路由只扫描App\Controllers\下的类,如果你把控制器放在App\Controllers\Admin\子命名空间里,哪怕类名是Dashboard,访问/admin/dashboard也必然404——框架根本不往下钻命名空间层级。更糟的是,错误日志里不会告诉你“没找到App\Controllers\Admin\Dashboard”,只会静默返回404,调试时得翻源码才能确认扫描范围。
升级CI3旧项目时最易踩的坑
很多CI3项目习惯用小写控制器文件名(home.php)配小写类名(class home extends CI_Controller),迁到CI4后即使开启了自动路由,home.php里的class Home(首字母大写)才被识别,而class home会被跳过——PHP类名本身区分大小写,CI4不帮你纠错。
自动路由不是快捷方式,是调试期的临时拐杖。真要上线,每条路由都该有明确的HTTP动词、路径、控制器方法、过滤器和优先级——否则你写的不是路由配置,是猜谜题。











