自制PHP MVC框架实现登录拦截时遭遇Too many redirects错误求助
解决PHP MVC框架全局登录拦截的重定向循环问题
嘿,这个问题我太熟了!你碰到的Too many redirects错误,本质是登录拦截逻辑陷入了无限循环——你的代码把登录页面也给拦下来了,导致用户没登录时被跳转到登录页,结果登录页又触发拦截,再次跳转,反复循环直到浏览器叫停。
核心解决方案:给登录页面加“白名单”
你需要在拦截逻辑里排除登录相关的路由,让登录页面不受拦截规则的限制。具体可以这么做:
1. 先获取当前请求的路由
首先要拿到用户当前访问的URL或者对应的控制器/方法,比如通过$_SERVER['REQUEST_URI']获取当前请求路径:
// 去掉首尾斜杠,方便后续判断 $currentRoute = trim($_SERVER['REQUEST_URI'], '/');
2. 调整拦截逻辑,跳过登录路由
修改你的全局拦截代码,判断如果当前是登录页面,就不执行重定向:
// 先确保session已启动(这步新手很容易忘!) if (session_status() === PHP_SESSION_NONE) { session_start(); } // 定义不需要拦截的路由白名单,比如登录页、忘记密码页都要排除 $allowedRoutes = ['signin', 'signin/forget']; // 拦截逻辑:如果不在白名单且未登录,才执行跳转 if (!in_array($currentRoute, $allowedRoutes) && !$this->isLoggedIn()) { header('Location: /signin/'); exit; // 用exit代替die,语义更清晰规范 }
3. 额外注意事项
- 确保路由判断准确:如果你的登录路由带查询参数(比如
/signin?from=xxx),记得用parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)获取纯路径部分再判断,避免参数干扰。 - 检查session状态:如果没调用
session_start(),$_SESSION变量会不存在,导致isLoggedIn()一直返回false,同样会引发循环。 - 路由一致性:确保重定向的URL和登录页面的实际路由完全匹配(比如带不带斜杠、大小写是否一致)。
调试小技巧
如果还是有问题,可以临时加日志输出,帮你快速定位问题:
// 写入服务器错误日志 error_log( "当前路由: " . $_SERVER['REQUEST_URI'] . " | 登录状态: " . ($this->isLoggedIn() ? '已登录' : '未登录') );
查看服务器的错误日志,就能清楚看到每次请求的路由和登录状态,快速找到循环的触发点。
内容的提问来源于stack exchange,提问作者Cat Named Dog
相关产品推荐
相关产品推荐

