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

生产环境Next.js中间件出现多次重定向错误求助

解决Vercel生产环境下Next.js中间件重定向循环问题

问题原因

你的代码在生产环境出现重定向循环,核心原因是生产环境中req.cookies的获取方式错误:

  • 在Next.js的Middleware中,req.cookies是RequestCookies对象,而非普通键值对对象,直接通过req.cookies['admin_cookie']拿到的是包含name和value的对象,而非cookie的实际值。
  • 这会导致cookie !== 'cookie_password'永远为true,即使用户已持有正确cookie,也会被强制重定向;若登录页/Auth/在用户有cookie时自动跳转到受保护路径,就会触发循环。

开发环境可能因版本或环境差异,允许直接通过下标获取value,但生产环境严格遵循规范,导致逻辑失效。

修复后的代码

import { NextResponse } from 'next/server'

export function middleware(req) {
  // 正确获取cookie的值,可选链处理cookie不存在的情况
  const adminCookie = req.cookies.get('admin_cookie')?.value;
  const currentPath = req.nextUrl.pathname;

  // 直接放行登录页请求,避免不必要的校验
  if (currentPath.startsWith('/Auth/')) {
    return NextResponse.next();
  }

  // 仅对受保护路径进行cookie校验
  if ((currentPath.startsWith('/Submissions') || currentPath.startsWith('/Batches')) && adminCookie !== 'cookie_password') {
    return NextResponse.redirect(new URL('/Auth/', req.url));
  }

  // 其他路径直接放行
  return NextResponse.next();
}

// 可选:配置matcher,只让相关路径经过中间件,提升性能
export const config = {
  matcher: ['/Submissions/:path*', '/Batches/:path*', '/Auth/:path*'],
};

关键修改点

  • 使用req.cookies.get('admin_cookie')?.value获取cookie的实际值,避免因对象类型判断错误导致的逻辑失效。
  • 新增登录页路径的放行逻辑,减少无效判断。
  • 配置matcher(可选),限制中间件仅处理需要校验的路径,优化执行效率。

内容的提问来源于stack exchange,提问作者Brace Sproul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:55:30