redirect
redirect
関数を使用すると、ユーザーを別のURLにリダイレクトできます。redirect
はサーバーコンポーネント、ルートハンドラー、サーバーアクションで使用できます。
ストリーミングコンテキストで使用する場合、クライアント側でリダイレクトを実行するためのmetaタグを挿入します。サーバーアクションで使用する場合は、呼び出し元に303 HTTPリダイレクトレスポンスを返します。それ以外の場合は、呼び出し元に307 HTTPリダイレクトレスポンスを返します。
リソースが存在しない場合は、代わりにnotFound
関数を使用できます。
補足:
- サーバーアクションとルートハンドラーでは、
redirect
はtry/catch
ブロックの後に呼び出す必要があります。- 307(一時的)の代わりに308(永続的)HTTPリダイレクトを返したい場合は、代わりに
permanentRedirect
関数を使用できます。
パラメーター
redirect
関数は2つの引数を受け取ります:
パラメーター | 型 | 説明 |
---|---|---|
path | string | リダイレクト先のURL。相対パスまたは絶対パスを指定できます。 |
type | 'replace' (デフォルト)または'push' (サーバーアクションのデフォルト) | 実行するリダイレクトの種類。 |
デフォルトでは、redirect
はサーバーアクションではpush
(ブラウザ履歴スタックに新しいエントリを追加)を、その他の場所ではreplace
(ブラウザ履歴スタックの現在のURLを置き換え)を使用します。type
パラメーターを指定することでこの動作をオーバーライドできます。
type
パラメーターは、サーバーコンポーネントで使用する場合は効果がありません。
戻り値
redirect
は値を返しません。
例
サーバーコンポーネント
redirect()
関数を呼び出すと、NEXT_REDIRECT
エラーがスローされ、それが投げられたルートセグメントのレンダリングが終了します。
補足:
redirect
はreturn redirect()
を使用する必要はありません。TypeScriptのnever
型を使用しているためです。
クライアントコンポーネント
redirect
はサーバーアクションを通じてクライアントコンポーネントで使用できます。イベントハンドラーを使用してユーザーをリダイレクトする必要がある場合は、useRouter
フックを使用できます。
FAQ
なぜredirect
は307と308を使用するのですか?
redirect()
を使用すると、一時的なリダイレクトに307
、永続的なリダイレクトに308
が使用されていることに気づくでしょう。従来は、一時的なリダイレクトに302
、永続的なリダイレクトに301
が使用されていましたが、多くのブラウザーは302
を使用する際に、元のリクエストメソッドに関わらず、リダイレクト時のリクエストメソッドをPOST
からGET
に変更しました。
/users
から/people
へのリダイレクトの例を考えてみましょう。新しいユーザーを作成するために/users
にPOST
リクエストを行い、302
一時的なリダイレクトに従う場合、リクエストメソッドがPOST
からGET
に変更されます。これは理にかなっていません。新しいユーザーを作成するには、/people
にPOST
リクエストを行うべきであり、GET
リクエストではありません。
307
ステータスコードの導入により、リクエストメソッドがPOST
として保持されます。
302
- 一時的なリダイレクト、リクエストメソッドをPOST
からGET
に変更307
- 一時的なリダイレクト、リクエストメソッドをPOST
として保持
redirect()
メソッドは、デフォルトで302
ではなく307
を使用するため、リクエストは常にPOST
リクエストとして保持されます。
詳細情報についてはHTTPリダイレクトをご覧ください。
バージョン履歴
バージョン | 変更内容 |
---|---|
v13.0.0 | redirect が導入されました。 |