リダイレクト
Next.jsでリダイレクトを処理する方法はいくつかあります。このページでは、各利用可能なオプション、ユースケース、および多数のリダイレクトを管理する方法について説明します。
コンポーネント内でリダイレクトする必要がある場合は、useRouter
フックの push
メソッドを使用できます。例:
補足:
- プログラム的にユーザーをナビゲートする必要がない場合は、
<Link>
コンポーネントを使用する必要があります。
詳細については、useRouter
API リファレンスを参照してください。
next.config.js
ファイルの redirects
オプションを使用すると、受信したリクエストのパスを別の宛先パスにリダイレクトできます。これは、ページのURL構造を変更する場合や、事前に既知のリダイレクトのリストがある場合に便利です。
redirects
はパス、ヘッダー、Cookie、クエリのマッチングをサポートしており、受信したリクエストに基づいてユーザーをリダイレクトする柔軟性を提供します。
redirects
を使用するには、next.config.js
ファイルにオプションを追加します:
詳細については、redirects
API リファレンスを参照してください。
補足:
redirects
は、permanent
オプションで 307(一時リダイレクト)または 308(永久リダイレクト)のステータスコードを返すことができます。
redirects
はプラットフォームによって制限される場合があります。例えば、Vercelでは 1,024 個のリダイレクトに制限されています。1000以上のリダイレクトを管理するには、ミドルウェアを使用したカスタムソリューションの作成を検討してください。大規模なリダイレクトの管理を参照してください。
redirects
はミドルウェアの前に実行されます。
ミドルウェアを使用すると、リクエストの完了前にコードを実行できます。その後、受信したリクエストに基づいて、NextResponse.redirect
を使用して別のURLにリダイレクトできます。これは、条件に基づいてユーザーをリダイレクトする場合(認証、セッション管理など)や、大量のリダイレクトがある場合に便利です。
例えば、認証されていないユーザーを /login
ページにリダイレクトするには:
補足:
- ミドルウェアは
next.config.js
の redirects
の後、レンダリングの前に実行されます。
詳細については、ミドルウェアのドキュメントを参照してください。
1000以上のリダイレクトを管理するには、ミドルウェアを使用したカスタムソリューションの作成を検討する必要があります。これにより、アプリケーションを再デプロイせずにリダイレクトをプログラム的に処理できます。
そのためには、以下を考慮する必要があります:
- リダイレクトマップの作成と保存。
- データルックアップのパフォーマンス最適化。
Next.js の例: 以下の推奨事項の実装については、Bloom フィルターを使用したミドルウェアの例を参照してください。
リダイレクトマップは、データベース(通常はキー値ストア)またはJSONファイルに保存できるリダイレクトのリストです。
次のデータ構造を検討してください:
ミドルウェアでは、VercelのEdge ConfigまたはRedisなどのデータベースから読み取り、受信したリクエストに基づいてユーザーをリダイレクトできます:
すべての受信リクエストに対して大きなデータセットを読み取ると、遅くなり、高コストになる可能性があります。データルックアップのパフォーマンスを最適化する方法は2つあります:
前の例を考慮すると、生成された Bloom フィルターファイルをミドルウェアにインポートし、受信したリクエストのパスネームが Bloom フィルターに存在するかをチェックできます。
存在する場合は、リクエストを API Routes に転送し、実際のファイルをチェックし、ユーザーを適切なURLにリダイレクトします。これにより、すべての受信リクエストを遅くする可能性のある大きなリダイレクトファイルをミドルウェアにインポートすることを回避できます。
次に、APIルートでは:
補足:
- ブルームフィルターを生成するには、
bloom-filters
のようなライブラリを使用できます。
- 悪意のあるリクエストを防ぐために、Route Handlerへのリクエストを検証する必要があります。