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

CodeIgniter3多语言应用路由别名与URL缩写冲突致404问题

问题解决:CodeIgniter3多语言路由别名404错误

问题分析

带语言前缀的deposit链接出现404的核心原因是路由匹配逻辑:

  • 通用语言前缀路由$route['(\w{2})/(.*)'] = '$2';会将en/deposit这类URI直接映射到deposit控制器,但deposit只是路由别名,实际不存在对应的控制器,因此框架返回404。
  • CodeIgniter3的路由匹配是从上到下、单次匹配,不会对重写后的URI再次执行路由规则匹配。

解决方案

方案一:添加带语言前缀的专属路由(推荐,简单直接)

在通用语言路由规则之前,添加针对deposit的带语言前缀路由,确保优先匹配:

修改routes.php:

$route['default_controller']       = 'home';
// 优先匹配带语言前缀的deposit路由
$route['(\w{2})/deposit']          = 'add_funds/index';
$route['(\w{2})/(.*)']             = '$2';
$route['(\w{2})']                  = $route['default_controller'];
$route['404_override']             = 'custom_page/page_404';
$route['translate_uri_dashes']     = false;
$route['deposit']                  = 'add_funds/index';

这样访问en/deposit、ru/deposit等链接时,会直接匹配到这条规则,映射到实际存在的add_funds/index方法,避免触发寻找不存在的deposit控制器。

方案二:通用路由兼容别名(适合大量路由别名场景)

如果后续有很多类似的路由别名,逐个添加规则太繁琐,可以自定义转发逻辑,让重写后的URI再次执行路由匹配:

  1. 创建Router.php控制器:
<?php
class Router extends CI_Controller {
    public function forward($uri) {
        // 重新初始化路由规则
        $this->load->library('router');
        $_SERVER['REQUEST_URI'] = '/' . $uri;
        $this->router->_set_routing();
        
        // 加载并调用目标控制器方法
        $class = $this->router->class;
        $method = $this->router->method;
        
        $this->load->controller($class);
        call_user_func_array([$this->$class, $method], $this->uri->segment_array());
    }
}
  1. 修改通用语言路由规则:
$route['(\w{2})/(.*)'] = 'router/forward/$2';

这样所有带语言前缀的URI都会先转发到Router控制器的forward方法,重新执行路由匹配,自动适配所有已定义的路由别名。

额外优化

你的supported_langs数组未包含默认语言ar,如果需要支持app.com/ar/deposit这类链接,建议把ar加入数组:

$supported_langs = ['ar'=>'arabic','en'=>'english','ru'=>'russian','es'=>'spanish','fr'=>'french'];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:42:17