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

CodeIgniter多语言切换出现URL叠加404错误求助

修复语言切换器的双重语言前缀404问题

看起来你的语言切换器在跨非默认语言切换时,会把当前语言前缀保留并叠加新的前缀,导致出现mysite.com/en/ru这类无效路径。这是因为当前代码没有正确移除已存在的语言前缀,而是直接拼接新前缀。让我们一步步修复这个问题:

问题根源分析

在非默认语言的处理分支中,你当前的代码只是尝试移除目标语言的缩写(比如切换到ru时,只从uri中删除ru),但并没有处理当前页面已有的当前语言前缀(比如你在en页面时,uri里的en并没有被移除)。再加上base_url()可能在非默认语言环境下已经带有当前语言前缀,最终导致双重路径的出现。

解决方案代码

我们需要先统一清理掉uri中已有的任何语言前缀(en/ru),再根据目标语言重新构建正确的URL:

<?php
// 预处理:清理uri中的语言前缀,得到纯净的页面路径
$current_uri = trim(uri_string(), '/');
// 移除开头的en/或ru/,处理带路径的情况(如en/about)
$clean_uri = preg_replace('/^(en|ru)\//', '', $current_uri);
// 单独处理只有语言前缀的情况(如当前uri就是en或ru)
if ($current_uri === 'en' || $current_uri === 'ru') {
    $clean_uri = '';
}

foreach ($languages as $language) {
    if ($language['abbr'] == MY_DEFAULT_LANGUAGE_ABBR) {
        // 切换到默认语言:直接使用纯净路径(无语言前缀)
        $change_url = !empty($clean_uri) ? base_url($clean_uri) : base_url();
    } else {
        // 切换到非默认语言:拼接目标语言前缀 + 纯净路径
        $change_url = !empty($clean_uri) 
            ? base_url($language['abbr'] . '/' . $clean_uri) 
            : base_url($language['abbr']);
    }
?>
<li>
    <a href="<?= $change_url ?>">
        <img src="<?= base_url('attachments/langflags/' . $language['flag']) ?>" alt="<?= $language['name'] ?>">
        <span><?= ucfirst($language['name']) ?></span>
    </a>
</li>
<?php } ?>

关键改动说明

  1. 纯净路径处理:通过正则/^(en|ru)\//精准移除uri开头的语言前缀,确保不管当前在哪个非默认语言页面,都能得到不带语言标记的真实页面路径。
  2. 边界情况处理:单独判断当前uri就是纯语言前缀的情况(比如en或ru),此时纯净路径为空,避免出现de/en这类无效路径。
  3. URL构建逻辑简化:根据目标语言类型(默认/非默认),直接使用纯净路径拼接,彻底避免双重前缀的问题。

测试验证

修改后所有切换场景都能生成正确URL:

  • 从默认语言(mysite.com)切换到en → mysite.com/en
  • 从en主页(mysite.com/en)切换到ru → mysite.com/ru
  • 从en的about页面(mysite.com/en/about)切换到ru → mysite.com/ru/about
  • 从ru的contact页面(mysite.com/ru/contact)切换到默认语言 → mysite.com/contact

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:54:17