因为codeigniter 4默认关闭自动路由,必须手动添加$routes->get('/home', 'home::index'),且路径开头需有/、控制器名首字母大写、方法名小写、双冒号正确;未清缓存或正则引用错误也会导致404。

为什么 /home 访问报 404?
因为 CodeIgniter 4 默认关闭自动路由,$routes->get('/home', 'Home::index') 这行必须手动加,否则框架根本不会尝试把 /home 映射到 Home 控制器。常见错误包括:路径漏写开头的 /、控制器名写成 home(应为 Home)、方法名写成 Index(应为 index)、双冒号写成点号或单冒号。另外,改完 app/Config/Routes.php 后不执行 php spark cache:clear,缓存会继续生效,导致新路由不加载。
怎么写动态参数路由?
两种主流写法:(:num) 和正则捕获,不能混用或写错引用符号。
-
$routes->get('/product/(:num)', 'Product::view/$1'):只匹配纯数字,控制器方法签名必须是public function view(int $id),类型提示不能省 -
$routes->get('/user/([a-zA-Z][a-zA-Z0-9_]{2,19})', 'User::profile/$1'):正则括号必须英文半角,$1引用不能写成$2或漏掉$;匹配失败时不会 fallback,直接 404 - 注意
(:any)不匹配斜杠/,多级路径如/blog/category/post要改用(:segment)或正则([a-zA-Z0-9\-\/]+)
数据库驱动的语义化路由怎么搞?
CI4 没有原生“从 DB 加载路由”的机制,但可以用通配符 + 控制器查库兜底实现,关键在顺序和校验。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 在
Routes.php中加:$routes->get('(:any)', 'BlogController::show/$1'),且必须放在所有静态路由之后、$routes->set404Override()之前 -
BlogController::show(string $slug)中先做格式校验,比如if (! preg_match('/^[a-z0-9\-]+$/i', $slug)) { throw new PageNotFoundException(); } - 查库前建议先查缓存:
cache()->get("slug_{$slug}"),命中则跳过 DB;未命中再查并cache()->save() - 别忘了抛
\CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(),否则 404 页面不会触发
多语言前缀路由为什么总 404?
语言前缀如 /zh/、/en/ 是普通 URI 段,不是内置特性,必须显式注册,且顺序极易踩坑。
- 错误写法:
$routes->get('(:any)', 'LangRouter::route/$1')放在最前面 → 所有带前缀的路径都被它吃掉,$1变成zh/home整体,无法拆解 - 正确做法:把
$routes->get('/zh/home', 'Home::index')、$routes->get('/en/home', 'Home::index')这类路由写在通配符之前 - 语言码不能靠控制器参数自动注入,
public function index(string $lang = 'zh')不会生效;必须在路由里传参,例如$routes->get('/zh/about', 'Page::about/zh'),再让方法接收public function about(string $lang)
最容易被忽略的是缓存清理和正则括号的中英文状态——写错一个字符,$1 就失效,参数传不到控制器里。










