Next.js 13.4中间件路由保护重定向过多问题求助
问题原因分析
你的代码触发无限重定向循环的核心原因有两个:
- 匹配规则覆盖了重定向目标路径:
config.matcher里的/:path*会匹配所有路径(包括首页/)。当用户持有令牌时,中间件会重定向到/,但这个路径又会被 matcher 捕获,再次进入中间件执行重定向,形成死循环。 - 未区分路径类型的逻辑判断:没有区分「认证路径(/auth/)」和「应用主路径(非/auth/)」的处理逻辑,导致无论用户在哪个路径,都会触发不符合场景的重定向。
修复方案
调整中间件的逻辑判断和匹配规则,明确不同路径的处理逻辑:
import { NextRequest, NextResponse } from "next/server"; export default async function middleware(req: NextRequest) { const path = req.nextUrl.pathname; const authToken = req.cookies.get("OurSiteJWT"); // 定义认证相关路径((auth)分组下的路由) const isAuthPath = path.startsWith("/auth"); // 定义需要保护的应用主路径((root)分组下的路由,排除静态资源) const isProtectedPath = !isAuthPath && !path.startsWith("/_next/static") && path !== "/favicon.ico"; // 已登录用户访问认证路径(比如/login),重定向到首页 if (authToken && isAuthPath) { return NextResponse.redirect(new URL("/", req.url)); } // 未登录用户访问受保护路径,重定向到登录页 if (!authToken && isProtectedPath) { return NextResponse.redirect(new URL("/auth/login", req.url)); } // 其他情况允许继续访问 return NextResponse.next(); } export const config = { // 匹配所有路径,但排除Next.js静态资源和favicon,避免不必要的中间件执行 matcher: ["/((?!_next/static|favicon.ico).*)"], };
关键调整点说明
- 路径区分:通过
isAuthPath和isProtectedPath明确不同路径的处理逻辑,避免无差别重定向。 - 匹配规则优化:使用排除式匹配跳过静态资源路径,减少中间件执行次数,同时避免对这些路径的误处理。
- 循环阻断:已登录用户访问认证路径才跳首页,未登录用户访问主路径才跳登录页,从逻辑上切断循环触发条件。
内容的提问来源于stack exchange,提问作者Mohammed Hamdoon
相关产品推荐
相关产品推荐

