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