Next.js中Next-auth中间件全局路由匹配致请求过多问题求助
解决NextAuth中间件全路由认证导致请求过多崩溃的问题
问题根源
用/:path*全路由匹配时,会触发无限循环请求:
- 未登录状态下,
withAuth会重定向到登录页,但登录页也被/:path*匹配,中间件反复触发认证检查,形成死循环 - 静态资源、Next内部资源(
/_next/*)、NextAuth认证接口(/api/auth/*)未提前排除,导致这类请求也走认证逻辑,加重请求负载 - locale重写逻辑和全路由规则叠加,可能引发重复重写
修复方案
精准配置matcher规则,提前排除无需认证的路径
把不需要认证的路径从matcher中排除,只匹配需要保护的路由,从根源避免循环:export const config = { matcher: [ // 匹配所有路径,排除无需认证的资源和页面 '/((?!api/auth|_next/static|_next/image|favicon.ico|login|signup).*)', ], };规则说明:跳过NextAuth认证接口、Next静态资源、站点图标、登录/注册页,其余路径均触发认证检查。
简化中间件逻辑,避免重复判断
由于matcher已经排除了静态资源和内部路径,中间件只需保留locale处理逻辑即可:import { NextRequest, NextResponse } from 'next/server'; import { withAuth } from 'next-auth/middleware'; export default withAuth( async function middleware(req: NextRequest) { // 仅处理默认locale的重写逻辑 if (req.nextUrl.locale === 'default') { const localeCookie = req.cookies.get('NEXT_LOCALE'); const locale = localeCookie ? localeCookie.value : 'en'; return NextResponse.rewrite( new URL( `/${locale}${req.nextUrl.pathname}${req.nextUrl.search}`, req.url, ), ); } }, { callbacks: { authorized({ token }) { // 存在token则允许访问 return !!token; }, }, // 指定未登录时的跳转页,确保该页已被matcher排除 pages: { signIn: '/login', }, }, );确保登录页不受认证保护
必须把登录页(如/login)加入matcher的排除列表,否则未登录时会陷入"重定向→认证检查→再次重定向"的死循环,这是请求崩溃的核心原因。
验证效果
配置完成后:
- 访问
/teacher、/student等受保护路由时,未登录会跳转到/login,登录后正常访问 - 静态资源、认证接口、登录页不会触发认证检查,避免无效请求
- locale重写逻辑正常运行,无循环重定向问题
内容的提问来源于stack exchange,提问作者Ahmed Elhoseny
相关产品推荐
相关产品推荐

