如何修改Next.js中间件,让已认证用户访问登录页时跳转至仪表盘?
已认证用户跳转与公共页面访问控制方案
要实现你需要的功能,只需在中间件里增加路径判断逻辑,分两种场景处理即可,完全可行。
修改后的中间件代码
import { NextRequest, NextResponse } from 'next/server' export async function middleware(req: NextRequest) { // 实际项目替换为真实认证逻辑:从cookie/请求头取token并验证有效性 const token = req.headers.get('token') || req.cookies.get('token')?.value const userIsAuthenticated = !!token // 此处为简化判断,实际需验证token合法性 const currentPath = req.nextUrl.pathname // 定义已登录用户禁止访问的公共页面 const publicRestrictedPaths = ['/login', '/register'] // 定义未登录用户禁止访问的私有页面 const privatePaths = ['/dashboard', '/api/private/:path*', '/profile'] // 场景1:已认证用户访问登录/注册页 → 跳转至仪表盘 if (userIsAuthenticated && publicRestrictedPaths.includes(currentPath)) { return NextResponse.redirect(new URL('/dashboard', req.url)) } // 场景2:未认证用户访问私有页面 → 跳转至登录页 if (!userIsAuthenticated && privatePaths.some(path => { // 处理带通配符的动态路径匹配 if (path.includes(':path*')) { const basePath = path.replace(':path*', '') return currentPath.startsWith(basePath) } return currentPath === path })) { // 携带当前路径作为回调参数,登录后可直接跳回原页面 const signinUrl = new URL('/login', req.url) signinUrl.searchParams.set('callbackUrl', currentPath) return NextResponse.redirect(signinUrl) } // 其他场景正常放行 return NextResponse.next() } // 配置中间件生效路径,仅在需要控制的路径上运行,提升性能 export const config = { matcher: [ '/login', '/register', '/dashboard/:path*', '/api/private/:path*', '/profile' ] }
关键逻辑说明
- 路径分组管理:将页面分为「已登录禁访的公共页」和「未登录禁访的私有页」,分别设置跳转规则,后续新增页面只需修改对应数组即可
- 通配符路径兼容:对带
:path*的动态路径,通过前缀匹配覆盖所有子路径,适配嵌套路由场景 - 用户体验优化:跳转登录时携带当前访问的私有路径,用户登录完成后可直接返回原页面
- 性能优化:通过
matcher配置缩小中间件运行范围,避免在静态资源、公共文档等无需控制的路径上执行
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

