NextAuth.js + Next.js13自定义登录页与Middleware重定向循环问题
NextAuth.js + Next.js 13 自定义登录页重定向循环问题解决
问题原因
启用NextAuth的默认Middleware后,它会默认保护所有路由,包括你配置的自定义登录页/login。触发循环的完整流程:
- 未登录用户访问受保护路由,Middleware将其重定向到NextAuth默认的
/auth/signin - 由于你在NextAuth配置中设置了
pages.signIn: '/login',NextAuth会将用户跳转至自定义登录页/login - 但Middleware检测到用户未登录,又会把
/login的请求重定向回/auth/signin,形成无限循环
从你提供的响应头也能验证这一点:/login请求被重定向到/api/auth/signin,且callbackUrl嵌套了/login的地址,说明循环已经在叠加参数。
解决方法
方法1:自定义Middleware,排除登录页路由
不要直接导出默认的NextAuth Middleware,而是通过withAuth自定义Middleware,明确排除登录页和NextAuth的认证接口路径:
import { withAuth } from "next-auth/middleware" export default withAuth({ pages: { signIn: "/login", // 和你的NextAuth配置保持一致 }, }) // 配置匹配规则:保护除login、api/auth之外的所有路由 export const config = { matcher: ["/((?!login|api/auth).*)"], }
matcher中的正则会排除/login(登录页)和/api/auth(NextAuth内部认证接口,必须排除否则会影响登录请求)- 这样Middleware只会拦截需要保护的路由,未登录用户可以正常访问
/login,不会触发循环
方法2:确保登录页无额外登录保护
检查你的/login页面代码,不要在页面内部添加未登录跳转逻辑(比如用useSession判断后强制跳转到其他页面),确保未登录用户能直接访问登录页。
额外检查
确认NextAuth配置中的pages.signIn路径和实际登录页路由完全一致,避免拼写错误导致的跳转异常。
内容的提问来源于stack exchange,提问作者Singh
相关产品推荐
相关产品推荐

