Middleware
Middlewareは、リクエストが完了する前にコードを実行することができます。その後、受信リクエストに基づいて、レスポンスをリライト、リダイレクト、リクエストやレスポンスヘッダーを変更、または直接応答することによって修正することができます。
Middlewareはキャッシュされたコンテンツやルートが一致する前に実行されます。詳細はMatching Pathsを参照してください。
ユースケース
アプリケーションにMiddlewareを統合することにより、パフォーマンス、セキュリティ、およびユーザーエクスペリエンスに大きな改善をもたらすことができます。Middlewareが特に効果的な一般的なシナリオには以下が含まれます:
- 認証と認可:特定のページやAPIルートへのアクセスを許可する前に、ユーザーのIDを確認し、セッションcookieを確認します
- サーバーサイドリダイレクト:特定の条件(例:ロケール、ユーザーロール)に基づいて、サーバーレベルでユーザーをリダイレクトします
- パスのリライト:A/Bテストや機能の展開、または古いパスをサポートするために、リクエストプロパティに基づいて動的にAPIルートやページへのパスをリライトします
- ボット検出:ボットトラフィックを検出してブロックすることにより、リソースを保護します
- ロギングと分析:ページやAPIが処理する前に、インサイトのためのリクエストデータをキャプチャおよび分析します
- 機能フラグ :シームレスな機能の展開やテストのために、動的に機能を有効/無効にします
Middlewareが最適でない状況を認識することも非常に重要です。以下のようなシナリオには注意が必要です:
- 複雑なデータのフェッチと操作:Middlewareは直接データをフェッチまたは操作するために設計されていないため、これはRoute Handlersまたはサーバーサイドユーティリティ内で行うべきです
- 重い計算タスク:Middlewareは軽量で迅速に応答する必要があり、ページの読み込みを遅らせる可能性があります。重い計算タスクや長時間実行プロセスは専用のRoute Handlers内で行うべきです
- 広範なセッション管理:Middlewareは基本的なセッションタスクを管理できますが、広範なセッション管理は専用の認証サービスまたはRoute Handlers内で管理すべきです
- 直接的なデータベース操作:Middleware内で直接的なデータベース操作を行うことは推奨されません。データベースの操作はRoute Handlersまたはサーバーサイドユーティリティ内で行うべきです
規約
プロジェクトのrootにファイルmiddleware.ts
(または.js
)を使用してMiddlewareを定義してください。例えば、pages
やapp
と同じレベル、または場合によってはsrc
の中に配置します。
注意:プロジェクトごとにサポートされる
middleware.ts
ファイルは1つだけですが、それでもモジュール式にミドルウェアロジックを整理できます。異なる.ts または.jsファイルにミドルウェア機能を分けて、メインのmiddleware.ts
ファイルにインポートします。これにより、ルート固有のミドルウェアをクリーンに管理し、middleware.ts
に集約して中央で制御できます。単一のミドルウェアファイルを強制することで、設定が簡素化され、潜在的な競合を防ぎ、複数のミドルウェア層を避けることでパフォーマンスが向上します。
例
- TypeScript
- JavaScript
middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
// `await`を内部で使用する場合、この関数は`async`としてマークできます
export function middleware(request: NextRequest) {
return NextResponse.redirect(new URL('/home', request.url))
}
// 詳細については以下の"Matching Paths"を参照してください
export const config = {
matcher: '/about/:path*',
}
middleware.js
import { NextResponse } from 'next/server'
// `await`を内部で使用する場合、この関数は`async`としてマークできます
export function middleware(request) {
return NextResponse.redirect(new URL('/home', request.url))
}
// 詳細については以下の"Matching Paths"を参照してください
export const config = {
matcher: '/about/:path*',
}