使用Middleware重定向至登录页时出现ERR_TOO_MANY_REDIRECTS循环问题
解决Next.js Middleware重定向循环问题
你的问题核心是Middleware会拦截所有请求,包括登录页本身。当用户没有token时,会被重定向到/auth/login,但访问这个页面又会触发Middleware检查token——此时依然没有token,于是再次重定向,最终陷入无限循环。
修复方案
修改Middleware代码,增加登录页的路径排除判断,仅在非登录页且无token时执行重定向:
import { NextResponse } from 'next/server' import type { NextRequest } from 'next/server' export function middleware(request: NextRequest) { const token =!!request.cookies.get('token'); const currentPath = request.nextUrl.pathname; // 仅在非登录页且无token时触发重定向 if (!token && currentPath!== '/auth/login') { // 基于当前请求域名构造登录页URL,避免环境变量路径拼接错误 return NextResponse.redirect(new URL('/auth/login', request.url)); } // 有token或处于登录页时,允许请求正常执行 return NextResponse.next(); }
关键修改说明
- 简化token判断:
!!request.cookies.get('token')本身就是布尔值,无需额外三元表达式 - 路径排除逻辑:跳过登录页的重定向检查,直接打破循环
- 稳定的URL构造:用
request.url作为基准生成登录页地址,避免依赖环境变量可能出现的路径错误 - 显式返回
NextResponse.next():确保有token或在登录页时,请求能正常通过Middleware
内容的提问来源于stack exchange,提问作者Saeed Hasani
相关产品推荐
相关产品推荐

