CodeIgniter3如何配置多段路由实现带语言前缀的URL访问
你的需求完全可实现,出现404是当前路由规则的正则匹配逻辑、控制器路由规则缺失两个问题共同导致的,按以下步骤修改即可:
问题原因说明
- 你写的路由规则
$route['en/(\w.+)'] = '$1';正则逻辑存在缺陷:\w.+要求en/后的首个字符必须是字母/数字/下划线,且后续至少有1个字符,匹配范围不全;且单条规则只支持en前缀,后续加其他语言还要重复写规则。 - 你没有配置控制器的参数路由:访问
/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
相关产品推荐
相关产品推荐

