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

Next.js 13.4中间件路由保护重定向过多问题求助

问题原因分析

你的代码触发无限重定向循环的核心原因有两个:

  1. 匹配规则覆盖了重定向目标路径:config.matcher 里的 /:path* 会匹配所有路径(包括首页 /)。当用户持有令牌时,中间件会重定向到 /,但这个路径又会被 matcher 捕获,再次进入中间件执行重定向,形成死循环。
  2. 未区分路径类型的逻辑判断:没有区分「认证路径(/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:38:11