最可靠的方式是修改 system/Router/Router.php 中的 _parse_routes() 方法,在遍历 $this->routes 时添加日志输出匹配尝试与成功信息,通过日志确认实际匹配的路由规则。

查看当前请求实际匹配的路由规则
CodeIgniter 不会自动告诉你当前 URL 匹配了哪条 $route 规则,但你可以通过启用调试模式 + 日志输出,或直接在核心路由解析阶段插入临时检查点来确认。最可靠的方式是修改 system/Router/Router.php 中的 _parse_routes() 方法(仅用于开发环境排查)。
- 打开
system/Router/Router.php,定位到protected function _parse_routes()方法 - 在循环遍历
$this->routes的地方(通常是foreach ($this->routes as $key => $val)内部),加一行临时日志:log_message('debug', 'Route match attempt: [' . $key . '] → ' . $val); - 同时在成功匹配后(即
if ($matched)分支里)加:log_message('debug', '✅ Route matched: [' . $key . '] → ' . $val); - 访问目标 URL,然后去
write/logs/查看最新 log 文件,搜索✅ Route matched
注意:这个改动不能留在生产环境,它会暴露路由结构且影响性能。CI 本身不提供 current_route() 这类 API,也别依赖第三方库“猜”匹配结果——因为路由顺序、正则优先级、占位符捕获都可能让预期和实际不一致。
$route 数组顺序直接影响匹配结果
CI 路由按数组定义顺序从上到下逐条尝试,一旦某条规则匹配成功就立即停止,后续规则不再检查。这意味着:
-
$route['product/(:num)'] = 'products/detail/$1';必须写在$route['product/(:any)'] = 'products/other/$1';前面,否则数字型 URL 会被泛匹配吃掉 -
$route['admin'] = 'admin/dashboard';和$route['admin/(:any)'] = 'admin/$1';必须严格按“具体→通用”排列,否则/admin会误入泛匹配,导致控制器方法名变成空字符串 - 自定义正则如
$route['api/v(\d+)/users'] = 'api/users/index/$1';中的(\d+)必须用括号捕获,否则$1无法取值
为什么 $route['default_controller'] 有时不生效
看似配置了 $route['default_controller'] = 'Home';,但访问根路径仍报 404,常见原因不是路由没命中,而是命中后调用失败:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- CI 实际执行的是
Home::index(),但你的Home.php控制器里没有定义public function index()方法 - 控制器文件名大小写不一致(如
home.phpvsHome.php),Linux 环境下直接加载失败 - 控制器继承错误,没写
extends CI_Controller,或用了旧版写法extends Controller(CI3 已废弃) -
index()方法存在,但被private或protected修饰,CI 只调用public方法
用 $_SERVER['REQUEST_URI'] 手动模拟路由匹配
如果你只是想快速验证某条路由规则是否能匹配某个 URL,可以脱离框架手动测试:
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$uri = trim($uri, '/');
// 模拟 CI 的 (:num) 替换逻辑
$pattern = '#^product/(\d+)$#';
if (preg_match($pattern, $uri, $matches)) {
echo "匹配成功,参数是:" . $matches[1]; // 输出 123(对应 /product/123)
}
这种写法不依赖 CI 加载流程,适合写个独立脚本批量验签路由正则,尤其当你改了一堆 $route 条目却不确定哪条起效时——比反复刷新页面看 404 更快。
真正容易被忽略的是:CI 的路由匹配发生在所有控制器加载之前,所以你在控制器里 var_dump($this->router) 看不到原始匹配过程,只能看到最终解析出的 class 和 method。要查“哪条规则命中”,必须在 Router 类内部动手,或者用上面的正则模拟法反推。


















