redirect
La función redirect
permite redirigir al usuario a otra URL. Se puede utilizar en Componentes de Servidor (Server Components), Manejadores de Ruta (Route Handlers) y Acciones de Servidor (Server Actions).
Cuando se usa en un contexto de transmisión (streaming), inserta una etiqueta meta para emitir la redirección en el lado del cliente. Cuando se usa en una acción de servidor, sirve una respuesta de redirección HTTP 303 al llamador. En otros casos, sirve una respuesta de redirección HTTP 307 al llamador.
Si un recurso no existe, puede usar la función notFound
en su lugar.
Es bueno saber:
- En Acciones de Servidor y Manejadores de Ruta,
redirect
debe llamarse después del bloquetry/catch
.- Si prefiere devolver una redirección HTTP 308 (Permanente) en lugar de 307 (Temporal), puede usar la función
permanentRedirect
.
Parámetros
La función redirect
acepta dos argumentos:
redirect(path, type)
Parámetro | Tipo | Descripción |
---|---|---|
path | string | URL a la que redirigir. Puede ser una ruta relativa o absoluta. |
type | 'replace' (predeterminado) o 'push' (predeterminado en Acciones de Servidor) | Tipo de redirección a realizar. |
Por defecto, redirect
usará push
(agrega una nueva entrada al historial del navegador) en Acciones de Servidor (Server Actions) y replace
(reemplaza la URL actual en el historial del navegador) en otros lugares. Puede anular este comportamiento especificando el parámetro type
.
El parámetro type
no tiene efecto cuando se usa en Componentes de Servidor.
Valor de retorno
redirect
no devuelve ningún valor.
Ejemplo
Componente de Servidor
Invocar la función redirect()
lanza un error NEXT_REDIRECT
y termina el renderizado del segmento de ruta en el que se lanzó.
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')
}
// ...
}
Es bueno saber:
redirect
no requiere que usesreturn redirect()
ya que utiliza el tiponever
de TypeScript.
Componente de Cliente
redirect
puede usarse en un Componente de Cliente a través de una Acción de Servidor. Si necesita usar un manejador de eventos para redirigir al usuario, puede usar el 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')}`)
}
Preguntas frecuentes
¿Por qué redirect
usa 307 y 308?
Al usar redirect()
, puede notar que los códigos de estado utilizados son 307
para una redirección temporal y 308
para una permanente. Tradicionalmente, se usaba 302
para redirecciones temporales y 301
para permanentes, pero muchos navegadores cambiaban el método de solicitud de POST
a GET
al usar 302
, independientemente del método original.
En el siguiente ejemplo de redirección de /users
a /people
, si hace una solicitud POST
a /users
para crear un nuevo usuario y se conforma con un 302
temporal, el método de solicitud cambiará de POST
a GET
. Esto no tiene sentido, ya que para crear un usuario debería hacer una solicitud POST
a /people
, no GET
.
La introducción del código de estado 307
significa que se preserva el método de solicitud como POST
.
302
- Redirección temporal, cambiará el método de solicitud dePOST
aGET
307
- Redirección temporal, preservará el método de solicitud comoPOST
El método redirect()
usa 307
por defecto en lugar de 302
, lo que significa que sus solicitudes siempre se preservarán como POST
.
Aprenda más sobre Redirecciones HTTP.
Historial de versiones
Versión | Cambios |
---|---|
v13.0.0 | Se introdujo redirect . |