NextJS 13中间件重定向异常:API无法命中端点且页面未跳转
NextJS 13中间件重定向问题修复
问题分析
你的代码存在三个核心问题,导致API无法命中且重定向失效:
- 重定向URL不规范:
NextResponse.redirect要求传入完整带协议头的URL(如http://localhost:3000/home),你写的localhost:3000/home缺少协议,导致重定向无效。 - 逻辑反向:当前代码只要请求路径包含"login"就强制重定向到home,直接拦截了
/api/login的请求,导致登录API根本无法被调用。 - 缺少登录状态判断:没有判断用户是否已登录的逻辑,完全无法实现"登录后重定向"的核心需求。
修正后的代码
假设你用cookie存储登录凭证(比如名为token的字段),修正后的中间件代码如下:
import { NextRequest, NextResponse } from "next/server"; export function middleware(req) { const url = req.nextUrl; // 从cookie判断用户是否已登录 const isLoggedIn = !!req.cookies.get("token"); // 已登录用户访问根路径或/login页面时,重定向到home if (isLoggedIn && (url.pathname === "/" || url.pathname === "/login")) { // 用当前请求的协议/域名自动拼接目标URL,避免硬编码问题 const homeUrl = new URL("/home", req.url); return NextResponse.redirect(homeUrl); } // 未登录用户访问home页面时,重定向到登录页 if (!isLoggedIn && url.pathname === "/home") { const loginUrl = new URL("/login", req.url); return NextResponse.redirect(loginUrl); } // 允许/api/login等公开API正常访问,不做拦截 return NextResponse.next(); } export const config = { // 只匹配需要拦截的页面路径,排除登录API matcher: ["/", "/login", "/home"], };
关键优化点
- 规范重定向URL:通过
new URL("/home", req.url)自动拼接当前请求的协议和域名,适配开发/生产不同环境,避免硬编码错误。 - 完善登录判断逻辑:基于cookie的登录状态判断,实现"已登录跳转首页、未登录跳转登录页"的正确流程。
- 调整匹配规则:在matcher中排除
/api/login,确保登录API能正常接收请求,不会被中间件拦截。
内容的提问来源于stack exchange,提问作者BlackWatch021
相关产品推荐
相关产品推荐

