You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:13:12