Menu

redirect

redirect関数を使用すると、ユーザーを別のURLにリダイレクトできます。redirectサーバーコンポーネントルートハンドラーサーバーアクションで使用できます。

ストリーミングコンテキストで使用する場合、クライアント側でリダイレクトを実行するためのmetaタグを挿入します。サーバーアクションで使用する場合は、呼び出し元に303 HTTPリダイレクトレスポンスを返します。それ以外の場合は、呼び出し元に307 HTTPリダイレクトレスポンスを返します。

リソースが存在しない場合は、代わりにnotFound関数を使用できます。

補足:

  • サーバーアクションとルートハンドラーでは、redirecttry/catchブロックの後に呼び出す必要があります。
  • 307(一時的)の代わりに308(永続的)HTTPリダイレクトを返したい場合は、代わりにpermanentRedirect関数を使用できます。

パラメーター

redirect関数は2つの引数を受け取ります:

redirect(path, type)
パラメーター説明
pathstringリダイレクト先のURL。相対パスまたは絶対パスを指定できます。
type'replace'(デフォルト)または'push'(サーバーアクションのデフォルト)実行するリダイレクトの種類。

デフォルトでは、redirectサーバーアクションではpush(ブラウザ履歴スタックに新しいエントリを追加)を、その他の場所ではreplace(ブラウザ履歴スタックの現在のURLを置き換え)を使用します。typeパラメーターを指定することでこの動作をオーバーライドできます。

typeパラメーターは、サーバーコンポーネントで使用する場合は効果がありません。

戻り値

redirectは値を返しません。

サーバーコンポーネント

redirect()関数を呼び出すと、NEXT_REDIRECTエラーがスローされ、それが投げられたルートセグメントのレンダリングが終了します。

app/team/[id]/page.js
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')
  }
 
  // ...
}

補足: redirectreturn redirect()を使用する必要はありません。TypeScriptのnever型を使用しているためです。

クライアントコンポーネント

redirectはサーバーアクションを通じてクライアントコンポーネントで使用できます。イベントハンドラーを使用してユーザーをリダイレクトする必要がある場合は、useRouterフックを使用できます。

app/client-redirect.tsx
TypeScript
'use client'
 
import { navigate } from './actions'
 
export function ClientRedirect() {
  return (
    <form action={navigate}>
      <input type="text" name="id" />
      <button>Submit</button>
    </form>
  )
}
app/actions.ts
'use server'
 
import { redirect } from 'next/navigation'
 
export async function navigate(data: FormData) {
  redirect(`/posts/${data.get('id')}`)
}
app/actions.js
'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へのリダイレクトの例を考えてみましょう。新しいユーザーを作成するために/usersPOSTリクエストを行い、302一時的なリダイレクトに従う場合、リクエストメソッドがPOSTからGETに変更されます。これは理にかなっていません。新しいユーザーを作成するには、/peoplePOSTリクエストを行うべきであり、GETリクエストではありません。

307ステータスコードの導入により、リクエストメソッドがPOSTとして保持されます。

  • 302 - 一時的なリダイレクト、リクエストメソッドをPOSTからGETに変更
  • 307 - 一時的なリダイレクト、リクエストメソッドをPOSTとして保持

redirect()メソッドは、デフォルトで302ではなく307を使用するため、リクエストは常にPOSTリクエストとして保持されます。

詳細情報についてはHTTPリダイレクトをご覧ください。

バージョン履歴

バージョン変更内容
v13.0.0redirectが導入されました。