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 } ?>
关键改动说明
- 纯净路径处理:通过正则
/^(en|ru)\//精准移除uri开头的语言前缀,确保不管当前在哪个非默认语言页面,都能得到不带语言标记的真实页面路径。 - 边界情况处理:单独判断当前uri就是纯语言前缀的情况(比如
en或ru),此时纯净路径为空,避免出现de/en这类无效路径。 - 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
相关产品推荐
相关产品推荐

