redirect
redirect
関数は、ユーザーを別のURLにリダイレクトするためのものです。redirect
は、Server Components、Route Handlers、およびServer Actionsで使用できます。
ストリーミングコンテキストで使用すると、クライアント側でリダイレクトを発生させるメタタグを挿入します。server actionで使用すると、呼び出し元に303 HTTPリダイレクトレスポンスを提供します。それ以外の場合は、呼び出し元に307 HTTPリダイレクトレスポンスを提供します。
リソースが存在しない場合は、代わりにnotFound
関数を使うことができます。
知っておくとよいこと:
- Server ActionsとRoute Handlersでは、
redirect
はtry/catch
ブロックの後に呼び出すべきです- 307 (一時的)ではなく、308 (恒久的) HTTPリダイレクトを返したい場合は、代わりに
permanentRedirect
関数を使用できます
パラメータ
redirect
関数は2つの引数を取ります:
redirect(path, type)
パラメータ | 型 | 説明 |
---|---|---|
path | string | リダイレクト先のURL。相対パスまたは絶対パスを指定できます。 |
type | 'replace' (デフォルト) または 'push' (Server Actionsの場合のデフォルト) | 実行するリダイレクトのタイプ。 |
デフォルトで、redirect
はServer Actionsではpush
(ブラウザの履歴スタックに新しいエントリを追加)を、その他の場所ではreplace
(ブラウザの履歴スタックの現在のURLを置換)を使用します。この動作はtype
パラメータを指定することで上書きできます。
type
パラメータはServer Componentsで使用した場合、効果はありません。
戻り値
redirect
は値を返しません。
例
Server Component
redirect()
関数を呼び出すと、NEXT_REDIRECT
エラーがスローされ、それがスローされたルートセグメントのレンダリングが終了します。
import { redirect } from 'next/navigation'
async function fetchTeam(id) {
const res = await fetch('https://...')
if (!res.ok) return undefined
return res.json()
}
export default async function Profile({ params }) {
const team = await fetchTeam(params.id)
if (!team) {
redirect('/login')
}
// ...
}
知っておくとよいこと:
redirect
はreturn redirect()
を使用する必要はありません。TypeScriptのnever
型を使用するためです。
Client Component
redirect
はServer Actionを介してClient Componentでも使用できます。イベントハンドラを使用してユーザーをリダイレクトする必要がある場合は、useRouter
フックを使用できます。
- TypeScript
- JavaScript
'use client'
import { navigate } from './actions'
export function ClientRedirect() {
return (
<form action={navigate}>
<input type="text" name="id" />
<button>Submit</button>
</form>
)
}
'use client'
import { navigate } from './actions'
export function ClientRedirect() {
return (
<form action={navigate}>
<input type="text" name="id" />
<button>Submit</button>
</form>
)
}
- TypeScript
- JavaScript
'use server'
import { redirect } from 'next/navigation'
export async function navigate(data: FormData) {
redirect(`/posts/${data.get('id')}`)
}
'use server'
import { redirect } from 'next/navigation'
export async function navigate(data) {
redirect(`/posts/${data.get('id')}`)
}
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()
メソッドはデフォルトで307
を使用し、302
一時的なリダイレクトの代わりに使用します。これにより、リクエストが常にPOST
リクエストとして保持されます。
HTTPリダイレクトについて詳しく学ぶ。
バージョン履歴
バージョン | 変更点 |
---|---|
v13.0.0 | redirect が導入されました。 |