redirect

La fonction redirect permet de rediriger l'utilisateur vers une autre URL. Elle peut être utilisée dans les Composants Serveur, les Gestionnaires de Route et les Actions Serveur.

Dans un contexte de streaming, cette fonction insère une balise meta pour déclencher la redirection côté client. Lorsqu'elle est utilisée dans une action serveur, elle renvoie une réponse de redirection HTTP 303 à l'appelant. Sinon, elle renvoie une réponse de redirection HTTP 307.

Si une ressource n'existe pas, vous pouvez utiliser la fonction notFound à la place.

Bon à savoir :

  • Dans les Actions Serveur et les Gestionnaires de Route, redirect doit être appelée après le bloc try/catch.
  • Si vous préférez renvoyer une redirection HTTP 308 (Permanente) au lieu de 307 (Temporaire), vous pouvez utiliser la fonction permanentRedirect.

Paramètres

La fonction redirect accepte deux arguments :

redirect(path, type)
ParamètreTypeDescription
pathstringL'URL vers laquelle rediriger. Peut être un chemin relatif ou absolu.
type'replace' (par défaut) ou 'push' (par défaut dans les Actions Serveur)Le type de redirection à effectuer.

Par défaut, redirect utilise push (ajoute une nouvelle entrée dans l'historique du navigateur) dans les Actions Serveur et replace (remplace l'URL actuelle dans l'historique du navigateur) partout ailleurs. Vous pouvez modifier ce comportement en spécifiant le paramètre type.

Le paramètre type n'a aucun effet lorsqu'il est utilisé dans les Composants Serveur.

Valeur de retour

redirect ne renvoie aucune valeur.

Exemple

Composant Serveur

L'appel de la fonction redirect() génère une erreur NEXT_REDIRECT et interrompt le rendu du segment de route où elle a été déclenchée.

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')
  }

  // ...
}

Bon à savoir : redirect ne nécessite pas d'utiliser return redirect() car elle utilise le type TypeScript never.

Composant Client

redirect peut être utilisée dans un Composant Client via une Action Serveur. Si vous devez utiliser un gestionnaire d'événements pour rediriger l'utilisateur, vous pouvez utiliser le hook useRouter.

'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>
  )
}
'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

Pourquoi redirect utilise-t-elle 307 et 308 ?

Lorsque vous utilisez redirect(), vous remarquerez que les codes d'état utilisés sont 307 pour une redirection temporaire et 308 pour une redirection permanente. Traditionnellement, un 302 était utilisé pour une redirection temporaire et un 301 pour une redirection permanente, mais de nombreux navigateurs modifiaient la méthode de requête de la redirection, passant d'une POST à GET lors de l'utilisation d'un 302, quelle que soit la méthode de requête d'origine.

Prenons l'exemple d'une redirection de /users vers /people : si vous effectuez une requête POST vers /users pour créer un nouvel utilisateur et que vous êtes conforme à une redirection temporaire 302, la méthode de requête sera changée de POST à GET. Cela n'a pas de sens, car pour créer un nouvel utilisateur, vous devriez effectuer une requête POST vers /people, et non une requête GET.

L'introduction du code d'état 307 signifie que la méthode de requête est conservée comme POST.

  • 302 - Redirection temporaire, changera la méthode de requête de POST à GET
  • 307 - Redirection temporaire, conservera la méthode de requête comme POST

La méthode redirect() utilise par défaut un 307, au lieu d'une redirection temporaire 302, ce qui signifie que vos requêtes seront toujours conservées comme des requêtes POST.

En savoir plus sur les redirections HTTP.

Historique des versions

VersionChangements
v13.0.0Introduction de redirect.