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

Next.js 13 App目录多中间件无法生效,求排查解决

问题原因

Next.js 13 的中间件机制要求,middleware.ts(或.js)文件中只能导出一个名为 middleware 的函数作为执行入口,你额外导出的 middleware2 不会被框架加载执行,这就是跳转功能完全不生效的核心原因。

解决方案

把两个中间件的逻辑合并到同一个 middleware 函数中,按照业务需求的顺序执行逻辑即可。以下是修改后的完整代码:

import { NextResponse, NextRequest } from 'next/server'
import acceptLanguage from 'accept-language'
import { fallbackLng, languages } from './app/i18n/settings'

acceptLanguage.languages(languages)
const cookieName = 'i18next'

export function middleware(req: NextRequest) {
  let lng
  if (req.cookies.has(cookieName)) lng = acceptLanguage.get(req.cookies.get(cookieName).value)
  if (!lng) lng = fallbackLng

  // 先处理多语言重定向逻辑
  if (
    !languages.some(loc => req.nextUrl.pathname.startsWith(`/${loc}`)) &&
    !req.nextUrl.pathname.startsWith('/_next')
  ) {
    return NextResponse.redirect(new URL(`/${lng}${req.nextUrl.pathname}`, req.url))
  }

  // 再处理 /about 跳转逻辑
  if (req.nextUrl.pathname.startsWith('/about')) {
    return NextResponse.redirect(new URL('/home', req.url))
  }

  // 处理referer来源的cookie设置
  if (req.headers.has('referer')) {
    const refererUrl = new URL(req.headers.get('referer'))
    const lngInReferer = languages.find((l) => refererUrl.pathname.startsWith(`/${l}`))
    const response = NextResponse.next()
    if (lngInReferer) response.cookies.set(cookieName, lngInReferer)
    return response
  }

  return NextResponse.next()
}

export const config = {
  api: {
    bodyParser: false,
  },
  matcher: ['/((?!api|_next/static|_next/image|assets|favicon.ico|sw.js).*)']
}
注意事项
  • 逻辑顺序直接影响执行结果:如果先处理 /about 跳转,会跳过后续的多语言逻辑,需要根据实际业务需求调整顺序。
  • 所有中间件逻辑必须放在同一个 middleware 函数内,框架只会识别这一个入口函数。

内容的提问来源于stack exchange,提问作者Alireza Dorrani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:12:49