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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:12:09