¿Para qué sirve redirect en Nextjs?
La función redirect
te permite redirigir al usuario a otra URL. redirect
puede ser utilizado en Componentes del Servidor, Manejadores de Rutas y Acciones del Servidor.
import { redirect } from 'next/navigation'
async function fetchTeam(id: string) {
const res = await fetch('https://....')
if (!res.ok) return undefined
return res.json()
}
export default async function Profile({ params }: { id: string }) {
const team = await fetchTeam(params.id)
if (!team) redirect('/login')
// ...
}
-
El
redirect
retorna 307 (Redirección temporal) por default. Cuando se usa en un Server Action, retorna 303 (See Other), que es comúnmente utilizado para redirigir a una página exitosa resultado de una petición POST. -
El
redirect
genera internamente un error, así que no debe ser envuelto en un bloque try/catch. -
El
redirect
puede ser llamado desde Client Components durante el proceso de rendereo pero no dentro de event handlers (manejadores de eventos). Para esto utilice el hookuseRouter()
en su lugar.
Parámetros de redirect
La función redirect
acepta dos argumentos.
Parámetro | Tipo | Descripción |
---|---|---|
path | string | La dirección a donde redireccionar, puede ser absoluta o relativa. |
type | ‘replace’ o ‘push’ | El tipo de redirección a realizar. |
Por default
redirect
utilizapush
(agrega una nueva entrada a la pila del historial del navegador) para las Server Actions yreplace
(reemplaza la url actual en la pila del historial del navegador) en todos los demás casos. Se puede sobreescribir este comportamiento especificando el parámetrotype
(tipo).
El parámetro type
no tiene efecto cuando se utiliza en Componentes de Servidor.
Ejemplos
Server Component
Invocar la función redirect()
lanza un error NEXT_REDIRECT
y termina la renderización del segmento de ruta en el cual fue lanzado.
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')
// ...
}
La instrucción
redirect
no requiere que usesreturn redirect()
ya que utiliza el tiponever
de TypeScript.
Client Component
El redirect
puede ser utilizado en un Componente Cliente a través de una Acción del Servidor. Si necesitas usar un manejador de eventos para redirigir al usuario, puedes usar el hook useRouter
.
// app/client-redirect.tsx
'use client'
import { navigate } from './actions'
export function ClientRedirect() {
return (
<form action={navigate}>
<input 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')}`)
}
Cuando uses redirect()
, puedes notar que los códigos de estado utilizados son 307 para una redirección temporal y 308 para una redirección permanente. Tradicionalmente, se usaba un 302 para una redirección temporal y un 301 para una redirección permanente, pero muchos navegadores cambiaron el método de solicitud de la redirección, de una solicitud POST a una solicitud GET al usar un 302, independientemente del método de solicitud original.
Tomando el siguiente ejemplo de una redirección de /users
a /people
, si haces una solicitud POST a /users
para crear un nuevo usuario y estás cumpliendo con una redirección temporal 302, el método de solicitud se cambiará de POST a GET. Esto no tiene sentido, ya que para crear un nuevo usuario, deberías estar haciendo una solicitud POST a /people
, y no una solicitud GET.
La introducción del código de estado 307 significa que el método de solicitud se conserva como POST.
- 302 - Redirección temporal, cambiará el método de solicitud de POST a GET.
- 307 - Redirección temporal, conservará el método de solicitud como POST.
El método redirect()
usa un 307 por defecto, en lugar de una redirección temporal 302, lo que significa que tus solicitudes siempre se conservarán como solicitudes POST.
Conclusiones
La función redirect
en Next.js es una herramienta poderosa para manejar redirecciones tanto en componentes del servidor como del cliente. Permite redirigir a los usuarios de manera eficiente y segura, manteniendo el método de solicitud original cuando es necesario. Su uso adecuado puede mejorar la experiencia del usuario y la lógica de navegación de la aplicación. Es importante entender los diferentes códigos de estado y comportamientos asociados para utilizar redirect
de manera efectiva y evitar errores comunes en la redirección de rutas.