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

CodeIgniter3如何配置多段路由实现带语言前缀的URL访问

你的需求完全可实现,出现404是当前路由规则的正则匹配逻辑、控制器路由规则缺失两个问题共同导致的,按以下步骤修改即可:

问题原因说明

  1. 你写的路由规则$route['en/(\w.+)'] = '$1';正则逻辑存在缺陷:\w.+要求en/后的首个字符必须是字母/数字/下划线,且后续至少有1个字符,匹配范围不全;且单条规则只支持en前缀,后续加其他语言还要重复写规则。
  2. 你没有配置控制器的参数路由:访问/user/david时,CodeIgniter默认会尝试调用User控制器下的david()方法,而不是把david作为参数传给index()方法,找不到对应方法自然返回404。

具体配置步骤

打开application/config/routes.php,把以下路由规则写在所有规则的最前面(符合官方提到的「靠前路由优先级更高」的规则):

// 1. 适配带参数的User控制器路由,同时兼容多语言前缀
$route['([a-z]{2})/user/(:any)'] = 'user/index/$2';
// 2. 通用多语言路由:匹配所有双字母语言前缀的请求,转发到对应业务路由
$route['([a-z]{2})/(.+)'] = '$2';
// 3. 适配只有语言前缀的根路径请求,可根据你的实际首页控制器调整右侧地址
$route['([a-z]{2})'] = 'home/index';
// 4. 不带多语言前缀的User控制器参数路由(可选,看你是否需要兼容无前缀的访问)
$route['user/(:any)'] = 'user/index/$1';

如果需要在控制器里自动加载对应语言包,可以在你的MY_Controller构造方法中添加如下逻辑:

public function __construct() {
    parent::__construct();
    $current_lang = $this->uri->segment(1);
    // 自定义允许的语言列表和对应语言包名
    $allow_lang_list = [
        'en' => 'english',
        'fr' => 'french'
    ];
    if (isset($allow_lang_list[$current_lang])) {
        $this->config->set_item('language', $allow_lang_list[$current_lang]);
    }
}

配置完成后清空浏览器缓存再访问www.mysite.com/en/user/david即可正常返回内容。

内容的提问来源于stack exchange,提问作者dapidmini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:18:04