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

