リダイレクト
Next.jsでリダイレクトを処理する方法はいくつかあります。このページでは、各利用可能なオプション、ユースケース、および多数のリダイレクトを管理する方法について説明します。
redirect
関数を使用すると、ユーザーを別のURLにリダイレクトできます。サーバーコンポーネント、ルートハンドラー、サーバーアクションで redirect
を呼び出すことができます。
redirect
は、通常、変更やイベント後に使用されます。例えば、投稿を作成する場合:
補足:
redirect
はデフォルトで307(一時的リダイレクト)のステータスコードを返します。サーバーアクション内で使用される場合、303(その他を参照)を返します。これは、POSTリクエストの結果として成功ページにリダイレクトする際によく使用されます。
redirect
は内部的にエラーをスローするため、try/catch
ブロックの外で呼び出す必要があります。
redirect
はクライアントコンポーネントのレンダリングプロセス中に呼び出すことができますが、イベントハンドラーでは呼び出せません。代わりに useRouter
フックを使用できます。
redirect
は絶対URLも受け入れ、外部リンクにリダイレクトするために使用できます。
- レンダリングプロセスの前にリダイレクトする場合は、
next.config.js
または ミドルウェアを使用してください。
詳細については、redirect
APIリファレンスを参照してください。
permanentRedirect
関数を使用すると、ユーザーを別のURLに永久的にリダイレクトできます。サーバーコンポーネント、ルートハンドラー、サーバーアクションで permanentRedirect
を呼び出すことができます。
permanentRedirect
は、通常、エンティティの標準URLを変更する変更やイベント後に使用されます。例えば、ユーザーがユーザー名を変更した後のプロファイルURLの更新:
補足:
permanentRedirect
はデフォルトで308(永久リダイレクト)のステータスコードを返します。
permanentRedirect
は絶対URLも受け入れ、外部リンクにリダイレクトするために使用できます。
- レンダリングプロセスの前にリダイレクトする場合は、
next.config.js
または ミドルウェアを使用してください。
詳細については、permanentRedirect
APIリファレンスを参照してください。
クライアントコンポーネントのイベントハンドラー内でリダイレクトする必要がある場合は、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 フィルターに存在するかをチェックできます。
存在する場合は、リクエストを ルートハンドラ に転送し、実際のファイルをチェックし、ユーザーを適切なURLにリダイレクトします。これにより、すべての受信リクエストを遅くする可能性のある大きなリダイレクトファイルをミドルウェアにインポートすることを回避できます。
次に、Route Handlerでは:
補足:
- ブルームフィルターを生成するには、
bloom-filters
のようなライブラリを使用できます。
- 悪意のあるリクエストを防ぐために、Route Handlerへのリクエストを検証する必要があります。