重定向死循环主因是中间件误拦截登录页或逻辑反转:已登录时跳转登录页,或未排除免认证路径(如/signin)导致无限重定向;需检查放行逻辑、条件判断、中间件注册及代理配置。

重定向死循环通常是因为中间件把登录页自己也拦住了,或者判断逻辑写反了。核心就两点:放行路径没写对,或已登录却跳回登录页。
检查中间件是否误拦截登录/注册路由
如果用户还没登录,访问 /signin 却被重定向到 /signin 自身,说明中间件没识别出这是免认证页面。
- 确保中间件中明确排除登录、注册、首页等路径,不要用 || 拼多个
!=,容易逻辑恒真 - 推荐用
in_array($request->path(), ['signin', 'signup', ''])判断放行路径 - 示例正确写法:
if (!Session::has('loginId')) {
$excludedPaths = ['signin', 'signup', 'forgot-password'];
if (in_array($request->path(), $excludedPaths)) {
return $next($request);
}
return redirect('signin')->with('fail', '请先登录');
}
确认判断条件没有逻辑反转
常见错误是写成「已登录就跳转」,这会让用户登完立刻被踢回登录页。
- 错误写法:
if (Session::has('loginId')) { return redirect('signin'); } - 正确逻辑:只在 未登录 且当前路径不是免认证路径时才重定向
- 更稳妥的做法是直接使用 Laravel 原生的
auth()判断:if (auth()->guest())
验证中间件是否被正确挂载和触发
有时候根本不是逻辑问题,而是中间件压根没跑起来。
- 在
handle()开头加日志:Log::debug('AuthCheck hit', ['uri' => $request->uri()]); - 执行
php artisan route:list --path=/client,确认 Middleware 列是否包含你的中间件名 - 检查
app/Http/Kernel.php中间件注册位置:鉴权类中间件应放在$middlewareGroups['web'],而不是全局$middleware - 确保路由定义在
routes/web.php或显式调用了->middleware('web')
部署在子路径或反向代理时注意 URL 生成
如果跳转地址变成 http://localhost:8000/login,而实际访问的是 https://example.com/app/my-app,也会引发跳转异常甚至循环。
- 检查
.env中APP_URL=https://example.com/app/my-app(必须含协议和子路径) - 清空缓存:
php artisan config:clear && php artisan cache:clear - 配置
app/Http/Middleware/TrustProxies.php,设置受信任的代理 IP 和头信息


















