CodeIgniter项目路由异常:首次访问/admin/login跳转至首页
解决CodeIgniter路由首次访问
admin/login跳首页的问题 先看看你给出的routes.php代码:
$route['admin/login'] = 'admin/login/index'; $route['admin/add_client'] = 'admin/add_client/index'; $route['(:any)'] = function ($val){ require_once( BASEPATH .'database/DB.php' ); $db =& DB(); $db->select('url'); $db->from('interior_form'); $db->where('url',$val); $query = $db->get()->row(); $db->close(); if(sizeof($query)>0): return 'home'; else: return "404_override"; endif; };
根据你描述的问题——首次访问www.xyz.com/admin/login跳首页,第二次访问正常——我梳理出几个核心问题和对应的修复方案:
1. 路由匹配优先级与通配符问题(最可能)
CodeIgniter的路由规则是从上到下依次匹配,但这里有个容易踩坑的点:在CI3中,(:any)通配符只能匹配单个URI分段(也就是不包含斜杠的部分),而admin/login是两个分段(admin和login),理论上不会被$route['(:any)']匹配到。但如果你的服务器URL重写配置错误,或者使用了CI4(CI4中(:any)匹配所有字符包括斜杠),就会导致admin/login被这个闭包路由捕获。
修复方案:
把闭包路由的通配符改成仅匹配单个分段,并且确保静态路由(比如admin/login)放在所有通配路由的前面:
// 保留你的静态路由,放在最前面 $route['admin/login'] = 'admin/login/index'; $route['admin/add_client'] = 'admin/add_client/index'; // 把(:any)改成只匹配单个分段的路由,避免捕获多分段的admin/login $route['(:segment)'] = function ($val){ require_once( BASEPATH .'database/DB.php' ); $db =& DB(); $db->select('url'); $db->from('interior_form'); $db->where('url',$val); $query = $db->get()->row(); $db->close(); // 注意:sizeof($query)这种判断方式不准确,应该用isset()或者empty() if(isset($query->url)): return 'home'; else: return "404_override"; endif; };
2. 数据库查询的判断逻辑错误
你当前用sizeof($query)>0来判断是否存在匹配的记录,但$db->get()->row()返回的是一个对象或者null,sizeof()对对象的判断并不准确,可能导致首次请求时误判为存在记录,从而返回home路由。
修复方案:
把判断逻辑改成更可靠的方式:
// 替换原来的判断条件 if(!empty($query) && isset($query->url)): return 'home'; else: return "404_override"; endif;
3. 路由缓存或浏览器缓存问题
首次访问时,可能是CodeIgniter的路由缓存或者浏览器的重定向缓存导致错误匹配。
修复方案:
- 清理CodeIgniter的缓存文件(删除
application/cache目录下的路由缓存文件); - 在浏览器中强制刷新(Ctrl+F5)首次访问的页面,避免缓存影响;
- 确保你的
admin/login控制器没有输出不必要的重定向头(比如未登录时错误跳转到首页)。
验证步骤
- 先修改路由的通配符和判断逻辑;
- 清理缓存后,用隐私模式(无痕窗口)测试首次访问
admin/login,看是否还会跳首页; - 如果问题仍然存在,检查你的
admin/login控制器代码,确认没有在未登录时强制跳转到首页的逻辑。
内容的提问来源于stack exchange,提问作者Shantanu
相关产品推荐
相关产品推荐

