You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CodeIgniter中为所有路由统一添加/en前缀

解决方案

你当前已经完成了「带/en前缀的请求映射到对应控制器」的逻辑,只需要补充自动跳转和全局URL前缀配置,就可以实现全站自动适配,无需逐个修改路由:

1. 调整路由配置实现无前缀自动跳转

路由规则按照从上到下匹配的优先级排列,修改application/config/routes.php内容如下:

// 你的原有规则,处理带/en前缀的请求
$route['^en/(.+)$'] = "$1";
$route['^en$'] = $route['default_controller'];

// 所有不带/en前缀的请求统一跳转,优先级最低放在最后
$route['(:any)'] = function ($path) {
    // 如有不需要加前缀的路径(如静态资源、后台),在这里加判断排除
    if (str_starts_with($path, 'assets/') || str_starts_with($path, 'admin/')) {
        return $path;
    }
    return redirect('en/' . $path, 'auto', 301);
};
// 根路径单独跳转适配
$route['/'] = function () {
    return redirect('en', 'auto', 301);
};

注意:闭包路由需要CodeIgniter 3.1.10及以上版本支持,低版本请用下方钩子方案。

2. 全局配置URL自动带前缀

修改application/config/config.php中的站点根地址配置,直接把/en加到根地址末尾:

$config['base_url'] = 'https://你的站点域名/en/';

配置完成后,所有用CodeIgniter自带的base_url()、site_url()、anchor()等函数生成的链接,都会自动带上/en前缀,无需手动修改任何业务代码里的链接。


低版本CodeIgniter兼容方案

如果你的CodeIgniter版本低于3.1.10,不支持闭包路由,可以用前置钩子实现跳转:

  1. 开启钩子功能,修改application/config/config.php:
    $config['enable_hooks'] = TRUE;
    
  2. 新增钩子定义,修改application/config/hooks.php:
    $hook['pre_controller'][] = [
        'class'    => 'LangPrefix',
        'function' => 'checkPrefix',
        'filename' => 'LangPrefix.php',
        'filepath' => 'hooks',
    ];
    
  3. 新建钩子文件application/hooks/LangPrefix.php:
    <?php
    class LangPrefix {
        public function checkPrefix() {
            $uri = trim($this->uri->uri_string(), '/');
            if (!str_starts_with($uri, 'en/') && $uri !== 'en') {
                redirect('en/' . $uri);
            }
        }
    }
    

以上配置完成后,全站所有路由都会自动适配/en前缀,后续新增控制器也不需要额外加路由规则。

内容的提问来源于stack exchange,提问作者Kadour H. Kadour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:15:04