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

NextJS 13中间件重定向异常:API无法命中端点且页面未跳转

NextJS 13中间件重定向问题修复

问题分析

你的代码存在三个核心问题,导致API无法命中且重定向失效:

  1. 重定向URL不规范:NextResponse.redirect要求传入完整带协议头的URL(如http://localhost:3000/home),你写的localhost:3000/home缺少协议,导致重定向无效。
  2. 逻辑反向:当前代码只要请求路径包含"login"就强制重定向到home,直接拦截了/api/login的请求,导致登录API根本无法被调用。
  3. 缺少登录状态判断:没有判断用户是否已登录的逻辑,完全无法实现"登录后重定向"的核心需求。

修正后的代码

假设你用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:02:45