NextJS如何配置middleware仅对/pages目录下的页面生效
Next.js middleware仅触发pages页面请求的实现方案
不需要手动枚举所有pages路径,通过matcher否定正则+逻辑层兜底判断的组合方案即可实现零维护成本的配置,完全适配升级后的middleware执行规则。
第一步:配置matcher排除规则
利用Next.js matcher支持的否定前瞻正则,一次性排除所有系统路径、静态资源、API路由,自动命中所有pages目录下的页面请求(包含根路径、动态路由、嵌套路由),后续新增页面无需修改配置:
// middleware.js / middleware.ts 位于项目根目录 export const config = { matcher: [ // 匹配所有路径,排除以下规则命中的请求 '/((?!api|_next/static|_next/image|favicon.ico|.*\\..*).*)' ] }
正则逻辑说明:
- 自动排除
/api开头的API路由 - 自动排除
/_next下的静态构建资源、图片优化接口 - 自动排除所有带文件后缀的静态资源(如
.ico、.png、.svg、.js、.css等) - 剩余所有命中的路径,都是pages目录下对应的页面路由
第二步:middleware逻辑内加兜底判断
为了避免自定义静态路径漏配导致的异常,在业务逻辑前加一层放行判断,双层保障静态资源不会触发鉴权重定向逻辑:
import { NextResponse } from 'next/server' export function middleware(request) { const { pathname } = request.nextUrl // 兜底放行:静态资源、系统路径、API路由直接跳过后续逻辑 if ( pathname.startsWith('/_next') || pathname.startsWith('/api') || pathname.includes('.') ) { return NextResponse.next() } // 业务鉴权逻辑示例 // 1. 检查登录态cookie是否存在 const hasLoginCookie = request.cookies.has('你的登录态cookie字段名') // 2. 配置公开访问白名单,避免重定向死循环 const publicPathList = ['/login'] const isPublicPath = publicPathList.includes(pathname) // 3. 未登录且访问非公开页面时,重定向到登录页 if (!hasLoginCookie && !isPublicPath) { return NextResponse.redirect(new URL('/login', request.url)) } return NextResponse.next() }
方案优势
- 零路径维护成本:不需要手动枚举所有pages路径,新增、修改、删除页面时无需调整middleware配置
- 兼容性强:适配Next.js middleware规则升级后的执行逻辑,不会出现favicon、静态资源请求触发重定向的问题
- 扩展性好:如果有其他需要排除的路径(比如公开的静态页、第三方校验路径),只需要在matcher正则和兜底判断里加对应前缀即可
内容的提问来源于stack exchange,提问作者Emmanuel Campos
相关产品推荐
相关产品推荐

