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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:49:56