CodeIgniter自定义路由不生效的最常见原因是路由被显式禁用、重复初始化$routes实例、通配符路由位置错误、重写配置失效、控制器命名不规范或缓存未清除。

CodeIgniter自定义路由不生效,最常见的情况是访问 http://localhost/home 时直接返回 404 页面,即使 app/Controllers/Home.php 文件存在、类名正确、方法可调用——这说明请求根本没走到控制器,而是被路由系统拦截并判定为无匹配规则。
检查路由是否被显式禁用
打开 app/Config/Routes.php,查找是否存在 $routes->setAutoRoute(false) 或类似手动关闭自动路由的语句。CI4 默认就是 false,但若你或团队成员曾显式调用过该方法又未补充等效路由,就会导致所有未注册路径全部 404。
确认当前路由实例未被重复初始化:检查文件末尾是否意外新增了第二个 $routes = Services::routes();,这会覆盖前面所有已添加的规则。
【关键前提】必须在 $routes 实例上调用 add 方法,而非新建一个未使用的实例。
验证路由注册位置与顺序
CI4 路由匹配遵循「从上到下、先具体后模糊」原则。如果你把通配符路由写在了自定义路由之前,后者将永远无法命中。
第一步:定位你的自定义路由行(例如 $routes->get('/home', 'Home::index'););
第二步:确认它位于 $routes->set404Override() 之前;
第三步:检查其上方是否存在类似 $routes->get('(:any)', 'Pages::view/$1'); 的泛匹配规则——如有,必须将其剪切并粘贴到你的自定义路由下方。
排查 URL 协议与重写干扰
方法一:绕过重写直连测试
在浏览器中访问 http://localhost/index.php/home。若能正常打开,说明问题出在 Apache/Nginx 的 URL 重写配置,而非 PHP 路由逻辑。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
方法二:验证 .htaccess 是否生效(仅 Apache)
确认 public/.htaccess 文件存在且内容包含标准重写块,尤其注意 RewriteRule ^(.*)$ index.php/$1 [L] 中的 /$1 —— 斜杠不可省略,否则 URI 段落丢失,$this->uri->getSegment(1) 将为空。
方法三:Nginx 用户请检查 server 块中是否有 try_files $uri $uri/ /index.php?$query_string;,且 root 指向的是 public/ 目录,不是项目根目录。
确认控制器命名与命名空间一致性
CI4 对大小写极其敏感:URL 中的控制器段必须全小写,而 PHP 类名必须首字母大写,且严格对应文件名。
例如,要访问 /home,必须同时满足:
– 文件路径为 app/Controllers/Home.php(H 大写);
– 类定义为 class Home extends BaseController;
– 命名空间为 namespace App\Controllers;;
– 路由中写的是 'Home::index',不是 'home::index' 或 'HomeController::index'。
【致命错误点】Linux 服务器上若文件名为 home.php,即使 Windows 开发环境能运行,上线即 404。
清除路由缓存并验证生效状态
执行命令:php spark cache:clear 清除所有缓存;
再执行:php spark routes 查看当前已加载的全部有效路由列表;
在输出中搜索 /home 或你配置的路径,确认其真实存在且 HTTP 方法(GET/POST)匹配;
若未出现,说明该路由语句未被执行——检查是否误放在 if (ENVIRONMENT !== 'production') 条件块内,而当前环境是 production。


















