生产环境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
相关产品推荐
相关产品推荐

