CodeIgniter路由配置需同时满足Web服务器重写、框架版本匹配和规则顺序三者严丝合缝;CI3用application/config/routes.php数组赋值,CI4用app/Config/Routes.php中$routes->get()等方法,泛化规则须置尾,改后CI4需清缓存。

CodeIgniter 路由配置不是“写完就生效”,它必须和 Web 服务器重写、框架版本、匹配顺序三者严丝合缝,缺一不可。绝大多数 404 或跳转到 index.php 的问题,根源不在 routes.php 写错,而在底层请求根本没进框架。
CI3 和 CI4 的路由文件位置与语法完全不同
混用会直接导致路由完全不加载,连报错都不会有——框架只是安静地走默认逻辑。
- CI3:所有规则写在
application/config/routes.php,格式是$route['about'] = 'pages/view/about'; - CI4:路由定义在
app/Config/Routes.php,必须调用$routes->get()、$routes->post()等方法;$route数组已废弃,写了也无效 - 升级项目时,如果还留着旧版
routes.php里的数组写法,CI4 会彻底忽略它们
URL 匹配是前缀顺序匹配,不是正则全量匹配
写在前面的规则一旦匹配成功,后面的就不会再检查。泛化规则(如带 :any)必须放在具体规则之后,否则会“吞掉”本该更精确匹配的路径。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 错误写法:
$route['article/(:any)'] = 'blog/show/$1';放在最前 →/article/archive/2026会被它吃掉,/article/archive/(:num)永远不触发 - 安全写法:把
$route['article/archive/(:num)'] = 'blog/archive/$1';放在:any规则之前 -
$routekey 中不能含空格、中文、点号(如.pdf)或未转义特殊字符;/file/report.pdf必须用正则:$route['file/([a-zA-Z0-9\-_\.]+)'] = 'files/download/$1';
去掉 index.php 不是路由的事,是 Web 服务器的事
浏览器地址栏还显示 index.php,说明 Apache/Nginx 根本没把请求转发给 CodeIgniter,后面所有路由配置都白搭。
- Apache 需同时满足:启用
mod_rewrite、对应目录的AllowOverride All(不是None)、.htaccess放在项目根目录(CI3)或public/目录(CI4) - Nginx 需显式配置
try_files $uri $uri/ /index.php?$query_string; - 浏览器会缓存 302 重定向,务必用隐身窗口测试,否则你以为“改了没用”,其实是旧跳转在作祟
CI4 的 $routes->group() 必须用闭包,不能赋值
常见写法错误是把它当变量赋值,结果整个分组路由完全不注册,php spark routes 也查不到。
- 错误:
$routes->group('admin') = function($routes) { ... };→ 语法合法但无效果 - 正确:
$routes->group('admin', function($routes) { $routes->get('users', 'AdminUsers::index'); }); - group 前缀不带斜杠(
'admin'✅,'/admin/'❌),嵌套时路径自动拼接(group('api')内再group('v1')→ 实际匹配/api/v1/xxx) - HTTP 方法限定、过滤器(如
auth)必须在闭包内逐条设置,不能传参进group()调用
真正容易被忽略的是:CI4 修改路由后必须清应用缓存(php spark cache:clear),否则新规则不会生效;而 CI3 没这层缓存,改完即生效。这个差异会让跨版本调试的人反复踩坑。


















