如何在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,不支持闭包路由,可以用前置钩子实现跳转:
- 开启钩子功能,修改
application/config/config.php:$config['enable_hooks'] = TRUE; - 新增钩子定义,修改
application/config/hooks.php:$hook['pre_controller'][] = [ 'class' => 'LangPrefix', 'function' => 'checkPrefix', 'filename' => 'LangPrefix.php', 'filepath' => 'hooks', ]; - 新建钩子文件
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
相关产品推荐
相关产品推荐

