codeigniter 无 usedefinedroutesonly 配置项,需关闭自动路由并添加兜底404规则:ci4设 $routes->setautoroute(false) 并末尾加 $routes->get('(:any)', fn()=>throw new pagenotfoundexception());ci3确保无泛化路由且末尾设 $route['(.*)'] = 'errors/not_found'。

CodeIgniter 本身没有名为 useDefinedRoutesOnly 的全局开关或配置项。这个说法常见于开发者对“禁用自动路由”的误称——真正要实现“只走你写的路由,其余一律 404”,核心是**关闭自动路由(Auto Routing)**,并确保没有漏配的兜底规则。
CI4 中彻底禁用自动路由
在 CI4 中,自动路由默认是开启的(AutoRouterImproved),它会尝试根据 URL 路径自动匹配控制器和方法(如 /users/list → Users::list())。要让它完全失效,只需在 app/Config/Routes.php 开头将自动路由设为 false:
- 找到
$routes->setAutoRoute(false);这一行(通常在文件顶部附近) - 如果不存在,手动添加在
$routes = Services::routes();之后、任何$routes->get()之前 - 确认没有其他地方调用
$routes->setAutoRoute(true)覆盖它
CI3 中关闭自动路由
CI3 默认不启用自动路由,但如果你启用了(例如通过 $route['default_controller'] 之外的通配规则或第三方扩展),只需确保:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
$route['default_controller']已设置(否则根路径会 404) - 没启用类似
$route['(:any)'] = 'pages/view/$1';这类泛化兜底规则 - 没在
config.php中开启未文档化的自动匹配逻辑(标准 CI3 不含此功能,多为自定义改造)
补全 404 行为,堵死意外路径
即使关了自动路由,仍可能因顺序错误或泛化规则漏掉某些请求。稳妥做法是显式拦截所有未定义路径:
- CI4:在
Routes.php最末尾加一行$routes->set404Override('Errors::show404');(确保已存在该控制器) - CI4:再追加一条“捕获全部”的兜底路由(放在所有
$routes->get()之后):$routes->get('(:any)', static fn() => throw new \CodeIgniter\Exceptions\PageNotFoundException()); - CI3:在
routes.php最后加$route['(.*)'] = 'errors/not_found';,并确保Errors控制器或对应方法存在
验证是否生效
改完后必须清缓存并测试:
- CI4 执行
php spark cache:clear(路由缓存独立于视图缓存) - 访问一个**没在 routes.php 中明确定义**的路径(如
/nonexistent),应返回 404 页面,而不是尝试加载控制器 - 运行
php spark routes查看实际注册的路由列表,确认没有意外出现的自动推导路由










