middleware.js

middleware.js|ts 檔案用於撰寫 中介軟體 (Middleware),並在請求完成前於伺服器端執行程式碼。根據傳入的請求,您可以透過重寫、重新導向、修改請求或回應標頭,或直接回應來修改回應內容。

中介軟體會在路由渲染前執行,特別適用於實作自訂的伺服器端邏輯,例如身份驗證、日誌記錄或處理重新導向。

在專案根目錄中使用 middleware.ts (或 .js) 檔案來定義中介軟體。例如,與 apppages 同層級,或在適用的情況下放在 src 目錄內。

import { NextResponse, NextRequest } from 'next/server'

// 若內部使用 `await`,此函式可標記為 `async`
export function middleware(request: NextRequest) {
  return NextResponse.redirect(new URL('/home', request.url))
}

export const config = {
  matcher: '/about/:path*',
}

匯出項目

中介軟體函式

檔案必須匯出單一函式,可以是預設匯出或命名為 middleware。請注意,不支援從同一檔案匯出多個中介軟體。

middleware.js
// 預設匯出範例
export default function middleware(request) {
  // 中介軟體邏輯
}

設定物件 (選用)

可選地,可以與中介軟體函式一起匯出一個設定物件。此物件包含 matcher 用於指定中介軟體適用的路徑。

Matcher

matcher 選項允許您指定中介軟體執行的特定路徑。您可以透過以下幾種方式指定這些路徑:

  • 單一路徑:直接使用字串定義路徑,例如 '/about'
  • 多個路徑:使用陣列列出多個路徑,例如 matcher: ['/about', '/contact'],這會將中介軟體套用至 /about/contact

此外,matcher 支援透過正規表示式進行複雜的路徑規格設定,例如 matcher: ['/((?!api|_next/static|_next/image|.*\\.png$).*)'],可精確控制要包含或排除的路徑。

matcher 選項也接受物件陣列,包含以下鍵值:

  • source:用於匹配請求路徑的路徑或模式。可以是直接路徑匹配的字串,或用於更複雜匹配的模式。
  • regexp (選用):一個正規表示式字串,基於來源進一步調整匹配。提供對包含或排除路徑的額外控制。
  • locale (選用):布林值,設為 false 時忽略基於地區設定的路由匹配。
  • has (選用):根據特定請求元素(如標頭、查詢參數或 cookies)的存在條件進行指定。
  • missing (選用):專注於某些請求元素缺失的條件,例如缺少標頭或 cookies。
middleware.js
export const config = {
  matcher: [
    {
      source: '/api/*',
      regexp: '^/api/(.*)',
      locale: false,
      has: [
        { type: 'header', key: 'Authorization', value: 'Bearer Token' },
        { type: 'query', key: 'userId', value: '123' },
      ],
      missing: [{ type: 'cookie', key: 'session', value: 'active' }],
    },
  ],
}

參數

request

定義中介軟體時,預設匯出函式接受單一參數 request。此參數是 NextRequest 的實例,代表傳入的 HTTP 請求。

import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
  // 中介軟體邏輯寫在這裡
}

須知

  • NextRequest 是代表 Next.js 中介軟體中傳入 HTTP 請求的類型,而 NextResponse 是用於操作和發送回 HTTP 回應的類別。

NextResponse

中介軟體可以使用 NextResponse 物件,它擴展了 Web Response API。透過回傳 NextResponse 物件,您可以直接操作 cookies、設定標頭、實作重新導向和重寫路徑。

須知:對於重新導向,您也可以使用 Response.redirect 代替 NextResponse.redirect

執行環境

中介軟體僅支援 Edge 執行環境 (Edge Runtime)。無法使用 Node.js 執行環境。

版本歷史

版本變更
v13.1.0新增進階中介軟體標記
v13.0.0中介軟體可修改請求標頭、回應標頭和發送回應
v12.2.0中介軟體進入穩定版,請參閱 升級指南
v12.0.9在 Edge 執行環境中強制使用絕對 URL (PR)
v12.0.0新增中介軟體 (Beta 版)

On this page