如何在Next.js中间件中同时使用next-auth与next-intl?
整合next-auth与next-intl中间件的方案
要同时使用next-auth/middleware和next-intl/middleware,核心思路是自定义一个中间件函数,串联执行两个中间件的逻辑,而非直接导出两个默认中间件。以下是具体实现步骤:
实现代码
import { withAuth } from "next-auth/middleware"; import createMiddleware from "next-intl/middleware"; // 初始化next-intl国际化中间件 const intlMiddleware = createMiddleware({ locales: ["en", "es"], defaultLocale: "en" }); // 初始化next-auth认证中间件,可自定义登录跳转页 const authMiddleware = withAuth({ pages: { signIn: "/login" } }); // 自定义中间件,依次执行国际化和认证逻辑 export default function middleware(req) { // 先处理路径国际化(若需重定向到带locale的路径,直接返回结果) const intlResponse = intlMiddleware(req); if (intlResponse) return intlResponse; // 国际化处理完成后,执行认证检查 return authMiddleware(req); } // 合并两个中间件的匹配规则,只对符合条件的路径生效 export const config = { matcher: [ "/((?!api|_next|.*\\..*|register|login).*)" ] };
关键说明
- 中间件执行顺序:优先处理国际化逻辑,确保路径携带正确的locale标识后,再进行认证校验,避免认证跳转时丢失本地化信息。
- 匹配规则合并:
matcher同时排除了两个中间件不需要处理的路径:- 排除
api、_next、静态文件(.*\\..*)——满足next-intl的跳过规则 - 额外排除
register、login——满足next-auth的跳过规则(登录/注册页无需认证)
- 排除
- 避免重定向循环:确保
next-auth配置的signIn路径(如/login)在matcher的排除列表中,否则会出现未登录→跳登录页→登录页又触发认证检查的循环。
内容的提问来源于stack exchange,提问作者Wali ahmed
相关产品推荐
相关产品推荐

