codeigniter多语言seo友好url需采用语言前缀路径结构(如/en/blog或/zh/产品介绍),通过正则路由匹配、accept-language自动跳转、hreflang标签声明及lang_url()辅助函数统一生成链接,确保搜索引擎可索引且无重复内容。

CodeIgniter 多语言切换后要实现 SEO 友好 URL,核心是让语言标识自然融入 URL 路径(如 /en/blog/how-to-optimize-seo 或 /zh/产品介绍),同时保持路由可识别、内容可索引、链接可预测。这不是单纯加个参数的事,而是需要路由、语言检测、重写规则和模板输出四者协同。
URL 结构设计:语言前缀 + 语义化路径
避免用查询参数(如 ?lang=zh)或 session 切换语言——搜索引擎不抓取带问号的动态 URL,也不理解 session 状态。应采用路径前缀方式:
-
/en/about-us→ 英文版“关于我们” -
/zh/关于我们→ 中文版“关于我们” -
/ja/会社概要→ 日文版“公司概要”
这种结构清晰、可读性强,且利于搜索引擎区分不同语言版本,也方便设置 hreflang 标签。
路由配置:动态匹配语言前缀并传递给控制器
在 application/config/routes.php 中,用正则路由捕获语言代码,并将其作为第一个参数传入:
// 支持 en/zh/ja 三种语言,其他自动 fallback 到默认语言 $route['^(en|zh|ja)/(.+)$'] = '$2/$1'; // 如 /en/blog/1 → blog/index/en/1 $route['^(en|zh|ja)$'] = 'home/index/$1'; $route['^$'] = 'home/index'; // 默认语言入口(如 en)
然后在控制器中统一获取语言参数:
Gene6 FTP Server Professional v3.10.0.2 多语言特别版(集成了中文)
public function index($lang = null) {
$this->lang->load('common', $lang ?: 'en');
$this->data['current_lang'] = $lang ?: 'en';
$this->load->view('home', $this->data);
}
语言自动识别与跳转(兼顾用户体验和 SEO)
首次访问无语言前缀时,需合理判断用户偏好,但不能靠 JS 跳转(搜索引擎无法执行)。推荐做法:
- 服务端读取
Accept-Language请求头,结合 IP 地理位置做粗略判断 - 返回 302 重定向到对应语言前缀 URL(如访问
/→ 302 →/zh/) - 在首页
中显式声明所有语言版本的hreflang:
<link rel="alternate" hreflang="en" href="https://example.com/en/"><link rel="alternate" hreflang="zh" href="https://example.com/zh/"><link rel="alternate" hreflang="x-default" href="https://example.com/zh/">
生成多语言链接:用辅助函数统一处理
不要硬编码 URL,而应封装一个 lang_url() 辅助函数(放在 application/helpers/url_helper.php):
if (!function_exists('lang_url')) {
function lang_url($uri = '', $lang = null) {
$CI =& get_instance();
$current_lang = $lang ?: $CI->session->userdata('current_lang') ?: 'en';
$base = '/' . $current_lang;
return site_url($base . '/' . ltrim($uri, '/'));
}
}
视图中调用:@#@#@#@#@#@#@#@#@#@0,自动输出 /zh/blog/post-1 或 /en/blog/post-1。
不复杂但容易忽略:语言前缀必须全程参与路由解析、链接生成、静态资源路径(如 CSS/JS 的 base_url() 不受影响,但内容 URL 必须带前缀),否则搜索引擎会把同一页面的不同语言版本当作重复内容。










