middleware.js
middleware.js|ts
ファイルは、リクエストが完了する前にサーバー上でコードを実行するMiddlewareを作成するために使用されます。受信したリクエストに基づいて、レスポンスを書き換え、リダイレクト、リクエストやレスポンスのヘッダーの変更、または直接レスポンスを返すことができます。
Middlewareはルートがレンダリングされる前に実行されます。認証、ログ記録、リダイレクトの処理など、カスタムのサーバーサイドロジックを実装する際に特に便利です。
プロジェクトのルートにmiddleware.ts
(または.js)ファイルを使用してMiddlewareを定義します。例えば、app
またはpages
と同じレベル、または適用可能な場合はsrc
の内部に配置します。
エクスポート
Middleware関数
ファイルは、デフォルトエクスポートまたはmiddleware
という名前でエクスポートされる単一の関数をエクスポートする必要があります。同じファイルから複数のMiddlewareはサポートされていないことに注意してください。
Configオブジェクト(オプション)
オプションとして、Middleware関数とともにconfigオブジェクトをエクスポートできます。このオブジェクトには、Middlewareを適用するパスを指定するmatcherが含まれます。
Matcher
matcher
オプションを使用すると、Middlewareを実行する特定のパスをターゲットにできます。これらのパスは次のようにいくつかの方法で指定できます:
- 単一のパスの場合:文字列を直接使用してパスを定義します(例:
'/about'
)。 - 複数のパスの場合:配列を使用して複数のパスをリストします(例:
matcher: ['/about', '/contact']
)。これにより、/about
と/contact
の両方にMiddlewareが適用されます。
さらに、matcher
は正規表現を通じて複雑なパス指定をサポートします(例:matcher: ['/((?!api|_next/static|_next/image|.*\\.png$).*)']
)。これにより、含めるまたは除外するパスを正確に制御できます。
matcher
オプションは、以下のキーを持つオブジェクトの配列も受け入れます:
source
:リクエストパスと一致するパスまたはパターン。直接のパスマッチングのための文字列、またはより複雑なマッチングのためのパターンを使用できます。regexp
(オプション):sourceに基づいてマッチングを微調整する正規表現文字列。含めるまたは除外するパスをさらに詳細に制御できます。locale
(オプション):false
に設定すると、パスマッチングでロケールベースのルーティングを無視します。has
(オプション):ヘッダー、クエリパラメーター、クッキーなどの特定のリクエスト要素の存在に基づく条件を指定します。missing
(オプション):ヘッダーやクッキーなどの特定のリクエスト要素が存在しない条件に焦点を当てます。
パラメーター
request
Middlewareを定義する際、デフォルトエクスポート関数はrequest
という単一のパラメーターを受け取ります。このパラメーターは受信するHTTPリクエストを表すNextRequest
のインスタンスです。
補足:
NextRequest
は、Next.js MiddlewareでのHTTPリクエストを表す型であり、NextResponse
はHTTPレスポンスを操作して返すために使用されるクラスです。
NextResponse
Middlewareは、Web Response APIを拡張するNextResponse
オブジェクトを使用できます。NextResponse
オブジェクトを返すことで、クッキーの直接操作、ヘッダーの設定、リダイレクト、パスの書き換えを実行できます。
補足:リダイレクトの場合、
NextResponse.redirect
の代わりにResponse.redirect
を使用することもできます。
ランタイム
MiddlewareはEdgeランタイムのみをサポートします。Node.jsランタイムは使用できません。
バージョン履歴
バージョン | 変更点 |
---|---|
v13.1.0 | 高度なMiddlewareフラグが追加 |
v13.0.0 | Middlewareがリクエストヘッダー、レスポンスヘッダーを変更し、レスポンスを送信可能 |
v12.2.0 | Middlewareが安定、アップグレードガイドを参照 |
v12.0.9 | Edge Runtime で絶対URLを強制(PR) |
v12.0.0 | Middleware(ベータ)が追加 |