Next.js 13.4.13多中间件执行冲突问题求助
问题分析与解决方案
你的核心问题在于withMultiLanguage中间件的逻辑错误:所有分支都直接返回NextResponse.rewrite响应,导致后续的withAuth中间件永远无法执行;同时未设置localeCookie且未检查路径是否已包含locale前缀,可能引发重复重写的循环问题。
修正后的withMultiLanguage中间件
export function withMultiLanguage(middleware: NextMiddleware) { return async (request: NextRequest, event: NextFetchEvent) => { const languageCookie = request.cookies.get("localeCookie")?.value; const pathname = request.nextUrl.pathname; // 替换为你的实际有效locale列表 const validLocales = ["en", "zh"]; const pathSegments = pathname.split("/").filter(Boolean); // 检查当前路径是否已包含有效的locale前缀,避免重复添加 if (validLocales.includes(pathSegments[0])) { return middleware(request, event); } // 确定最终使用的locale,确保有效性 let locale = languageCookie ?? getLocale(request) ?? defaultLocale; if (!validLocales.includes(locale)) { locale = defaultLocale; } const newUrl = new URL(`/${locale}${pathname}`, request.nextUrl); // 修改request的URL,让后续中间件基于带locale前缀的路径处理 request.nextUrl.href = newUrl.href; request.nextUrl.pathname = newUrl.pathname; // 执行后续的withAuth中间件 const nextResponse = await middleware(request, event); // 若未设置语言cookie,添加cookie避免重复重写 if (!languageCookie) { nextResponse.cookies.set("localeCookie", locale, { path: "/", maxAge: 60 * 60 * 24 * 30, // 30天有效期 httpOnly: true, secure: process.env.NODE_ENV === "production", }); } // 返回重写响应,同时保留后续中间件的响应配置(头、cookie等) return NextResponse.rewrite(newUrl, { headers: nextResponse.headers, cookies: nextResponse.cookies, }); }; }
修正withAuth的公共路径判断
由于路径现在带有locale前缀(如/en/login),需要调整PUBLIC_PATHS的判断逻辑,去掉locale前缀后再匹配:
// 在withAuth的handleValidToken中修改路径判断 const pathSegments = request.nextUrl.pathname.split("/").filter(Boolean); // 去掉locale前缀后的基础路径 const basePath = pathSegments.length > 1 ? `/${pathSegments.slice(1).join("/")}` : "/"; if (PUBLIC_PATHS.includes(basePath)) { return redirectToHome(request); }
其他说明
chain函数和middleware.ts的配置无需修改,保持原样即可。- 修正后的逻辑会先处理路径前缀,再执行权限校验,同时确保重写和后续中间件的逻辑都生效,还能避免重复重写的循环问题。
内容的提问来源于stack exchange,提问作者DukeEmree
相关产品推荐
相关产品推荐

