NextJs - Middleware(中间件)

中间件允许您在请求完成之前运行代码。然后,根据传入的请求,您可以通过重写、重定向、修改请求或响应标头或直接响应来修改响应。

中间件在缓存内容和路由匹配之前运行。

使用规则

使用项目根目录中的文件 middleware.ts(或 .js)来定义中间件。例如,与页面或应用程序处于同一级别,或者在 src 内部(如果适用)。

javascript 复制代码
// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
 
// This function can be marked `async` if using `await` inside
export function middleware(request: NextRequest) {
  return NextResponse.redirect(new URL('/home', request.url))
}
 
// See "Matching Paths" below to learn more
export const config = {
  matcher: '/about/:path*',
}

匹配路径

将为项目中的每个路由调用中间件。以下是执行顺序:

  1. headers from next.config.js
  2. 来自 next.config.js的重定向
  3. 中间件(重写、重定向等)
  4. 来自 next.config.js 的 beforeFiles(重写)
  5. 文件系统路由(public/、_next/static/、pages/、app/等)
  6. 来自 next.config.js 的 afterFiles(重写)
  7. 动态路由 (/blog/slug)
  8. 从 next.config.js 回退(重写)

Matcher (匹配器)

matcher 允许您过滤中间件以在特定路径上运行。

javascript 复制代码
export const config = {
  matcher: '/about/:path*',
}

可以使用数组语法匹配单个路径或多个路径:

javascript 复制代码
export const config = {
  matcher: ['/about/:path*', '/dashboard/:path*'],
}

匹配器配置允许完整的正则表达式,因此支持负向查找或字符匹配等匹配。可以在此处查看用于匹配除特定路径之外的所有路径的负前瞻示例:

javascript 复制代码
export const config = {
  matcher: [
    /*
     * Match all request paths except for the ones starting with:
     * - api (API routes)
     * - _next/static (static files)
     * - _next/image (image optimization files)
     * - favicon.ico (favicon file)
     */
    '/((?!api|_next/static|_next/image|favicon.ico).*)',
  ],
}

注意:

  • 匹配器值需要是常量,以便可以在构建时对其进行静态分析。诸如变量之类的动态值将被忽略。

Configured:

  1. 必须以 / 开头
  2. 可以包含命名参数: /about/:path 匹配 /about/a 和 /about/b 但不匹配 /about/a/c
  3. 可以对命名参数进行修饰符(以 :) 开头: /about/:path* 匹配 /about/a/b/c 因为 * 为零或更多。 ?为零或一且+一或多个
  4. 可以使用括号括起来的正则表达式:/about/(.*) 与/about/:path* 相同
相关推荐
weixin_7275356220 小时前
MinIO大文件上传深度拆解:从原理到生产落地的完整指南
java·中间件
jieyucx2 天前
Nuxt4阶段六:工程化与进阶 —— 模块、中间件、插件、TS 与测试
中间件·vue·web·nuxt·全栈·ssr
索西引擎3 天前
【React】Redux 中间件机制:副作用处理与数据流增强的形式化分析
前端·react.js·中间件
糖果店的幽灵3 天前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
熊文豪4 天前
【金仓数据库征文】不装中间件的 MySQL→金仓在线迁移,mysql_fdw 全流程,和一个差点漏掉的 emoji
数据库·mysql·中间件·电科金仓
拆房老料5 天前
ONLYOFFICE AI Agent 深度解析:在线 Office 正从编辑器走向智能工作平台
人工智能·中间件·编辑器·word·开源软件
知行合一。。。6 天前
LangChain--08--中间件(Middleware)
中间件·langchain
●VON6 天前
鸿蒙 PC Markdown 编辑器可靠性设计:未保存内容的崩溃恢复闭环
华为·中间件·编辑器·harmonyos·鸿蒙
fuquxiaoguang7 天前
中间件的“价值重估”:传统同质化竞争终结,AI智能编排时代开启
人工智能·中间件
fuquxiaoguang8 天前
中间件的“结构性升级”:当智能编排成为政企采购的“硬指标”
中间件·ai智能体·ai原生