Next.js 14 App Router中NextAuth与next-i18n-router中间件冲突问题
问题根源
你当前的代码同时导出了NextAuth的认证中间件(作为默认导出)和自定义的i18n路由中间件,这在Next.js中是不允许的——一个middleware.ts文件只能生效一个中间件逻辑,后者会直接覆盖前者,导致NextAuth的认证逻辑完全无法执行。
解决方案
把两个中间件的逻辑合并到同一个函数中,优先执行认证检查,再处理多语言路由:
// middleware.ts import NextAuth from 'next-auth'; import { authConfig } from './auth.config'; import { i18nRouter } from 'next-i18n-router'; import i18nConfig from './i18nConfig'; import { NextRequest } from 'next/server'; // 初始化NextAuth认证中间件 const authMiddleware = NextAuth(authConfig).auth; export async function middleware(request: NextRequest) { // 先执行认证检查逻辑 const authResponse = await authMiddleware(request); // 如果认证中间件返回了响应(比如未登录时重定向到登录页),直接返回该响应 if (authResponse) { return authResponse; } // 认证通过或当前路径无需认证时,处理多语言路由 return i18nRouter(request, i18nConfig); } export const config = { matcher: ['/((?!api|_next/static|_next/image|.*\\.png$).*)'], };
关键说明
- 优先调用NextAuth的认证中间件并等待执行完成,确保认证逻辑先被处理
- 若认证中间件返回了
Response对象(比如重定向),直接返回该对象,终止后续逻辑 - 只有当认证检查通过或当前路径不需要认证时,才执行
i18nRouter的多语言路由处理
内容的提问来源于stack exchange,提问作者Francisco
相关产品推荐
相关产品推荐

