NextJS 14中间件重定向异常问题求助
NextJS 14 中间件重定向异常修复
核心问题
你的中间件代码未返回NextResponse实例,导致创建的重定向/继续响应无法被Next.js框架识别应用。虽然控制台能输出日志,但这些响应对象没有传递给框架,因此页面不会执行跳转。
修复后的代码
import { NextRequest, NextResponse } from "next/server"; import unauthorizedRoutes from "./utils/routes"; import evaluateTokensStatus from "./utils/evaluateTokens"; export async function middleware(request: NextRequest) { const tokensStatus = evaluateTokensStatus(); const isAuthenticated = tokensStatus === "valid" || tokensStatus === "expired"; const isUnauthorizedRoute = unauthorizedRoutes.some((route) => request.nextUrl.pathname.startsWith(route) ); console.log("isUnauthorizedRoute", isUnauthorizedRoute); console.log("isAuthenticated", isAuthenticated); // 未登录且访问非授权路由 → 跳转登录页 if (!isAuthenticated && !isUnauthorizedRoute) { return NextResponse.redirect(new URL("/auth/login", request.url)); } // 已登录且访问未授权路由 → 跳转首页 else if (isAuthenticated && isUnauthorizedRoute) { console.log("should redirect to /"); return NextResponse.redirect(new URL("/", request.url)); } // 合法访问场景 → 继续请求 else { console.log("should continue"); return NextResponse.next(); } } export const config = { matcher: ["/((?!api|_next/static|_next/image|.*\\.png$).*)"] };
额外排查点(若加return后未登录重定向仍失效)
- 验证
evaluateTokensStatus逻辑:确认该函数能正确返回valid/expired/其他状态,注意中间件中无法直接读取localStorage,需从请求的Cookie中获取token。 - 检查
unauthorizedRoutes定义:确保数组包含"/auth/login",比如const unauthorizedRoutes = ["/auth/login"];,否则路由匹配判断会出错。 - 排查重定向循环:确认
/auth/login不会被中间件重复拦截导致循环,当前匹配规则已排除静态资源,需保证未登录访问该路由时会进入else分支允许继续请求。
内容的提问来源于stack exchange,提问作者Enzo
相关产品推荐
相关产品推荐

