NextJs 13+JWT验证中间件:重定向过多及登录访问限制问题
解决Next.js 13 JWT验证的重定向循环与页面访问控制问题
问题现象
- 已登录用户仍可直接访问
/login或/register页面 - 访问上述页面时出现「localhost redirected you too many times」重定向循环错误
问题根源
- 原
matcher包含首页/,导致重定向到首页后会再次触发中间件,增加不必要的检查逻辑 - 当JWT无效时,访问登录页会触发重复重定向到登录页的循环(验证失败后直接重定向到
/login,而该页面又会被中间件拦截) - 逻辑分支未覆盖JWT验证失败后允许用户停留在登录页的场景
修改后的middleware.js代码
import { NextResponse } from "next/server"; import { verify } from "jsonwebtoken"; export function middleware(request) { const secret = process.env.JWT_SECRET; const jwt = request.cookies.get("jwt")?.value; const path = request.nextUrl.pathname; // 未登录用户访问需要权限的页面,重定向到登录页 if (!jwt && path.startsWith("/dashboard")) { return NextResponse.redirect(new URL("/login", request.url)); } // 已登录(JWT有效)用户访问登录/注册页,重定向到首页 if (jwt && (path === "/login" || path === "/register")) { try { verify(jwt, secret); return NextResponse.redirect(new URL("/", request.url)); } catch (error) { // JWT无效时,清除无效Cookie并允许访问登录页 const response = NextResponse.next(); response.cookies.delete("jwt"); return response; } } // 其他情况(如访问首页、JWT有效时访问权限页面)直接放行 return NextResponse.next(); } export const config = { // 只拦截需要控制的页面,去掉首页/避免不必要的中间件触发 matcher: ["/dashboard/:path*", "/login", "/register"], };
关键修改说明
- 调整匹配规则:移除
/,仅对需要权限校验的/dashboard系列页面和登录注册页触发中间件,减少不必要的逻辑执行 - 处理无效JWT:当JWT验证失败时,清除无效的Cookie并允许用户留在登录页,避免重定向循环
- 简化逻辑分支:拆分未登录权限拦截和已登录页面跳转的逻辑,让代码更清晰,避免分支覆盖不全的问题
内容的提问来源于stack exchange,提问作者Bipin
相关产品推荐
相关产品推荐

