codeigniter路由404循环跳转源于$route['404_override']配置不当、控制器方法缺失且无_remap兜底,或重写规则截断uri段;需检查404_override指向的方法是否触发新404、控制器文件名与类名是否规范、_remap是否定义,以及nginx/apache重写规则是否完整传递uri和查询参数。

CodeIgniter路由404一直跳转,说明请求被反复导向错误处理逻辑而非真实控制器,常见于$route['404_override']配置不当、控制器方法缺失但未定义_remap、或重写规则导致URL段被截断——此时浏览器地址栏可能显示不断刷新的/index.php/errors/not_found或循环重定向到首页。
检查404_override是否形成死循环
打开application/config/routes.php,确认$route['404_override']指向的控制器方法本身不会触发新的404。
例如:$route['404_override'] = 'Errors/not_found'; → 检查application/controllers/Errors.php是否存在且类名为Errors(首字母大写),方法not_found()是否为public且不含$this->load->view('xxx')调用不存在的视图文件。
【关键陷阱】若not_found()中执行redirect('/'),而根路径/又因路由未定义再次触发404,就会陷入无限重定向。必须确保该方法直接输出内容或跳转到绝对URL(如redirect('http://localhost/') )。
验证控制器方法是否存在且可访问
方法一:直连带index.php的URL测试
在浏览器访问http://yourdomain.com/index.php/welcome/index,能打开则说明框架基础运行正常;若仍404,检查application/controllers/Welcome.php文件名是否为Welcome.php(非welcome.php),类声明是否为class Welcome extends CI_Controller,且含public function index()。
方法二:用_remap拦截并兜底
在目标控制器(如User.php)顶部添加_remap方法:
public function _remap($method, $params = []) { if (method_exists($this, $method)) { return call_user_func_array([$this, $method], $params); } else { $this->index(); // 不存在的方法自动跳index } }
这一步绕过全局404,仅对当前控制器生效,避免因单个方法缺失引发跳转链断裂。
排查Nginx/Apache重写规则是否吃掉URI段
第一步:确认Web服务器是否将/user/profile正确转发给index.php
Apache用户检查public/.htaccess(CI4)或.htaccess(CI3)中RewriteRule是否含/$1——漏掉斜杠会导致profile段丢失,框架只收到user,找不到User::profile()方法。
第二步:Nginx用户核对server块中的try_files
必须为try_files $uri $uri/ /index.php?$query_string;,若写成/index.php?_url=/$1或漏掉$query_string,GET参数和URI路径都会丢失,路由匹配失败后直接404。
第三步:临时禁用重写,强制用index.php访问
将$config['index_page'] = 'index.php';(CI3)或app/Config/App.php中public $indexPage = 'index.php';(CI4)设为明确值,再访问http://localhost/index.php/user/profile。能通说明是重写问题,不通则聚焦控制器本身。










