codeigniter中通过environment常量实现多环境路由分离:①确认index.php中environment已正确定义并生效;②ci3在routes.php中按环境require_once对应web.php;③ci4在services.php中根据环境调用routes->add或加载专属配置类。

在CodeIgniter路由配置中直接使用环境变量,是为了让不同环境(开发/测试/生产)自动加载对应路由规则,避免手动切换导致线上路由错乱或调试路由泄露。
确认环境变量已生效
打开 index.php 文件,检查是否已正确定义 ENVIRONMENT 常量——这是所有后续环境判断的前提。若此处仍是默认值 'development' 且未通过服务器环境变量或 .htaccess 覆盖,则后续所有环境分支都不会触发。
运行 var_dump(ENVIRONMENT); 验证输出是否为 'production' 或 'testing';若仍显示 'development',说明环境未真正切换,路由中的环境分支将全部失效。
在routes.php中按环境加载不同路由文件
CodeIgniter 3 和 CI4 的路由加载机制不同,此处以 CI3 为主(CI4 使用 app/Config/Routes.php,逻辑一致但路径不同):
① 进入 application/config/routes.php,清空原有路由定义,只保留环境判断逻辑。
② 添加如下结构:
switch (ENVIRONMENT) {<br> case 'development':<br> require_once APPPATH . 'config/routes/' . ENVIRONMENT . '/web.php';<br> break;<br> case 'testing':<br> require_once APPPATH . 'config/routes/' . ENVIRONMENT . '/web.php';<br> break;<br> case 'production':<br> require_once APPPATH . 'config/routes/' . ENVIRONMENT . '/web.php';<br> break;<br>}
这一步必须用 require_once,不能用 include 或 require——前者确保同一文件不会被重复加载,后者若被多次包含会导致路由重复注册报错。
③ 在 application/config/routes/ 下分别创建 development/、testing/、production/ 三个子目录,并在每个目录中新建 web.php,写入对应环境的路由规则。
例如 production/web.php 中可关闭调试路由:$route['debug-info'] = 'errors/forbidden';;而 development/web.php 可开放:$route['debug-info'] = 'tools/debug_info';。
CI4 中通过 Services.php 动态注册路由
CI4 不再依赖全局 $route 数组,而是通过服务容器注入路由服务。要在不同环境下启用不同路由,需修改 app/Config/Services.php:
方法一:重写 routes() 方法
找到 public static function routes($getShared = true) 方法,在其内部添加环境判断:
if (ENVIRONMENT === 'production') {<br> $routes->add('api/v1/users', 'Api\Users::index', ['filter' => 'jwt']);<br>} else {<br> $routes->add('api/v1/users', 'Api\Users::index');<br> $routes->add('debug/route-list', 'Tools\RouteList::show');<br>}
注意:这里不能用 require 引入外部文件——CI4 的路由服务是单例对象,所有 add() 必须在同一个 $routes 实例上调用,否则后加载的路由会覆盖前一个。
方法二:使用环境专属配置文件(推荐)
在 app/Config/ 下创建 RoutesProduction.php、RoutesDevelopment.php 等文件,每个文件返回一个完整路由数组;然后在 Services::routes() 中根据 ENVIRONMENT 加载对应类并调用其 register() 方法。










