codeigniter多站点共用一套基础设置的关键是环境隔离与动态配置切换:统一application目录,通过域名或子目录识别站点,在index.php中动态设置site_id;配置、数据库、静态资源、语言包及路由均按site_code动态加载与隔离。

CodeIgniter 多站点共用一套基础设置,关键在于把“不变的”抽出来,“变的”按需加载——不是复制多份 application 目录,而是通过环境隔离 + 动态配置切换实现复用。
统一 application 目录,按域名或子目录区分站点
所有站点共享同一套 application/ 目录,但通过入口文件(index.php)或服务器配置识别当前访问的站点。常见做法有:
- 每个站点使用独立的 index.php 入口,但指向同一个 system/ 和 application/ 路径;在各自 index.php 中设置 $application_folder = '../application';,再根据 $_SERVER['HTTP_HOST'] 或 dirname(__FILE__) 动态设置站点标识(如 site_id)
- 若用子目录部署(如 example.com/site1/、example.com/site2/),可在 index.php 中读取 URI 路径段判断站点,再加载对应配置
- Apache/Nginx 配置中,用 SetEnv 或 fastcgi_param 注入站点环境变量(如 SITE_CODE=site_a),CI 启动时读取该变量
配置分离:把可变项移到站点专属 config 文件
不要硬编码在 application/config/ 下的通用文件里。推荐结构:
- 保持 config.php、database.php 等为“骨架”,只设默认值或占位符
- 新建 application/config/sites/ 目录,存放 site_a.php、site_b.php 等,内容类似:
return [ 'base_url' => 'https://site-a.com/', 'cookie_prefix' => 'sa_', 'app_name' => 'Site A' ]; - 在 MY_Controller 或钩子中自动加载:$this->config->load('sites/'.SITE_CODE, TRUE);,并用 $this->config->set_item() 覆盖全局配置项
数据库与资源路径按站点动态适配
避免多个站点共用同一数据库或混淆静态资源:
- database.php 中不写死 host/user/dbname,改用 switch(SITE_CODE) 分支返回不同连接参数
- 静态资源(CSS/JS/images)建议按站点分目录托管,如 assets/site_a/,并在站点配置中定义 asset_path,视图中用 base_url($this->config->item('asset_path')) 引用
- 上传目录也应隔离,比如 uploads/site_a/,通过 upload_path 配置项控制
语言包与路由规则支持多站点切换
多站点往往对应不同语言或区域,需联动处理:
- 语言目录仍按标准结构 application/language/zh_cn/,但语言选择逻辑升级:先识别站点,再读取该站点默认语言(如 site_a 默认 zh_cn,site_b 默认 en_us)
- 路由规则可分层加载:主 routes.php 加载公共路由,再根据 SITE_CODE include 'routes/'.SITE_CODE.'.php' 加载站点专属路由(如 /admin → site_a_admin 控制器)
- 注意清除语言缓存:$this->lang->is_loaded = [];,确保切换站点后语言文件不残留旧状态











