NextJS Middleware 引发无限重定向循环问题求助
无限重定向至/welcome的原因分析及解决方案
核心原因
无限重定向的本质是中间件对/welcome路径未做豁免检查:当已认证但未完善资料的用户被重定向到/welcome后,中间件会再次触发认证与资料检查,此时仍判定用户资料未完善,又将其重定向回/welcome,形成闭环循环。
此外可能伴随以下次要原因:
- 本地资料状态的判断逻辑错误,导致无论用户是否完善资料,都返回“未完善”的结果
- 用户资料更新后,中间件获取的状态未同步(如缓存未清除)
解决方案
1. 给中间件添加路径白名单
在中间件中排除无需检查的路径(/auth/signup、/welcome及相关API路径),避免对这些路径执行重定向逻辑。
修改后的middleware.ts核心逻辑示例:
import { NextRequest, NextResponse } from 'next/server'; // 定义无需检查的路径白名单 const exemptPaths = ['/auth/signup', '/welcome', '/api/auth']; export async function middleware(req: NextRequest) { const currentPath = req.nextUrl.pathname; // 跳过白名单路径的检查,直接放行 if (exemptPaths.some(path => currentPath.startsWith(path))) { return NextResponse.next(); } // 1. 检查Cognito认证状态(复用原代码中的认证逻辑) const isAuthenticated = await validateCognitoSession(req); if (!isAuthenticated) { return NextResponse.redirect(new URL('/auth/signup', req.url)); } // 2. 检查本地资料是否完善(自定义的资料检查逻辑) const hasCompletedProfile = await checkUserLocalProfile(req); if (!hasCompletedProfile) { return NextResponse.redirect(new URL('/welcome', req.url)); } // 所有检查通过,放行请求 return NextResponse.next(); } // 配置中间件生效的路径(按需调整) export const config = { matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'], };
2. 修正本地资料判断逻辑
确保checkUserLocalProfile函数能准确识别用户是否已完善资料:
- 若用户资料存储在数据库,需直接查询最新状态,避免依赖过期缓存
- 若通过会话存储状态,需在用户提交资料后及时更新会话中的标记
3. 优化/welcome页面的跳转逻辑
当用户在/welcome页面完成资料提交后,应直接跳转到目标页面(如首页),而非停留在/welcome,同时确保中间件能立即识别到资料已完善的状态。
内容的提问来源于stack exchange,提问作者sQQuil
相关产品推荐
相关产品推荐

