You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:01:18