Next.js中间件Admin配置:解决管理员重定向循环问题
解决管理员访问Admin路径时的重定向循环问题
问题根源
原代码中,只要是/admin/开头的路径,管理员用户都会被强制重定向到/admin/main/users。但这个目标路径同样满足pathname.startsWith("/admin/")的判断条件,导致每次请求都会触发中间件的重定向逻辑,形成无限循环,最终抛出ERR_TOO_MANY_REDIRECTS错误。
修正后的代码
给管理员的重定向逻辑添加终止条件,当用户已经处于允许访问的管理员路径时,直接放行请求:
if ( adminconfig?.matcher.includes(pathname) || pathname.startsWith("/admin/") ) { if (!isAuthenticated) { return NextResponse.redirect(new URL("/", request.nextUrl)); } else if (isAdmin) { // 若当前路径已是管理员允许访问的目标路径,直接放行 if (pathname === "/admin/main/users") { return NextResponse.next(); } return NextResponse.redirect( new URL("/admin/main/users", request.nextUrl) ); } else { return NextResponse.redirect(new URL("/not-admin", request.nextUrl)); } }
如果有多个允许管理员访问的路径,可以扩展为数组判断:
// 定义所有允许管理员直接访问的路径 const allowedAdminPaths = ["/admin/main/users", "/admin/main/dashboard", "/admin/settings"]; if ( adminconfig?.matcher.includes(pathname) || pathname.startsWith("/admin/") ) { if (!isAuthenticated) { return NextResponse.redirect(new URL("/", request.nextUrl)); } else if (isAdmin) { // 当前路径在允许列表中时,直接放行 if (allowedAdminPaths.includes(pathname)) { return NextResponse.next(); } return NextResponse.redirect( new URL("/admin/main/users", request.nextUrl) ); } else { return NextResponse.redirect(new URL("/not-admin", request.nextUrl)); } }
核心逻辑说明
通过添加路径判断,给管理员的重定向流程设置终止节点:当用户已经处于合法的管理员路径时,不再执行重定向操作,让请求正常通过中间件,彻底打破无限循环的链条。
内容的提问来源于stack exchange,提问作者Gülbeyaz BAYRAM ÖZER
相关产品推荐
相关产品推荐

