Middleware
Middleware le permite ejecutar código antes de que se complete una solicitud. Luego, según la solicitud entrante, puede modificar la respuesta reescribiendo, redirigiendo, modificando los encabezados de solicitud o respuesta, o respondiendo directamente.
Middleware se ejecuta antes de que se cargue el contenido en caché y se hagan coincidir las rutas. Consulte Coincidencia de Rutas para más detalles.
Casos de Uso
Algunos escenarios comunes donde Middleware es efectivo incluyen:
- Redirecciones rápidas después de leer partes de la solicitud entrante
- Reescribir a diferentes páginas basado en pruebas A/B o experimentos
- Modificar encabezados para todas las páginas o un subconjunto de páginas
Middleware no es adecuado para:
- Obtención lenta de datos
- Gestión de sesiones
Convención
Utilice el archivo middleware.ts
(o .js
) en la raíz de su proyecto para definir Middleware. Por ejemplo, al mismo nivel que pages
o app
, o dentro de src
si es aplicable.
Nota: Aunque solo se admite un archivo
middleware.ts
por proyecto, aún puede organizar su lógica de middleware de forma modular. Separe las funcionalidades del middleware en archivos.ts
o.js
separados e impórtelos en su archivo principalmiddleware.ts
. Esto permite una gestión más limpia del middleware específico de ruta, agrupado enmiddleware.ts
para un control centralizado. Al imponer un único archivo de middleware, se simplifica la configuración, se evitan posibles conflictos y se optimiza el rendimiento al evitar múltiples capas de middleware.
Ejemplo
Coincidencia de Rutas
Middleware se invocará para cada ruta en su proyecto. Dado esto, es crucial usar matchers para apuntar o excluir rutas específicas con precisión. El siguiente es el orden de ejecución:
headers
desdenext.config.js
redirects
desdenext.config.js
- Middleware (
rewrites
,redirects
, etc.) beforeFiles
(rewrites
) desdenext.config.js
- Rutas del sistema de archivos (
public/
,_next/static/
,pages/
,app/
, etc.) afterFiles
(rewrites
) desdenext.config.js
- Rutas Dinámicas (
/blog/[slug]
) fallback
(rewrites
) desdenext.config.js
Hay dos formas de definir en qué rutas se ejecutará Middleware:
Matcher
matcher
le permite filtrar Middleware para que se ejecute en rutas específicas.
Puede hacer coincidir una sola ruta o múltiples rutas con una sintaxis de array:
La configuración matcher
permite regex completo, por lo que se admite la coincidencia como búsquedas negativas o coincidencia de caracteres. Aquí se puede ver un ejemplo de búsqueda negativa para hacer coincidir todas las rutas excepto las específicas:
También puede omitir Middleware para ciertas solicitudes usando los arrays missing
o has
, o una combinación de ambos:
Bueno saber: Los valores de
matcher
deben ser constantes para que puedan analizarse estáticamente en tiempo de compilación. Los valores dinámicos como variables serán ignorados.
Matchers configurados:
- DEBEN comenzar con
/
- Pueden incluir parámetros con nombre:
/about/:path
coincide con/about/a
y/about/b
pero no con/about/a/c
- Pueden tener modificadores en parámetros con nombre (que comienzan con
:
):/about/:path*
coincide con/about/a/b/c
porque*
es cero o más.?
es cero o uno y+
uno o más - Pueden usar expresiones regulares entre paréntesis:
/about/(.*)
es lo mismo que/about/:path*
Lea más detalles en la documentación de path-to-regexp.
Bueno saber: Por compatibilidad con versiones anteriores, Next.js siempre considera
/public
como/public/index
. Por lo tanto, un matcher de/public/:path
coincidirá.
Declaraciones Condicionales
NextResponse
La API NextResponse
le permite:
redirect
la solicitud entrante a una URL diferenterewrite
la respuesta mostrando una URL dada- Establecer encabezados de solicitud para Rutas API,
getServerSideProps
y destinos derewrite
- Establecer cookies de respuesta
- Establecer encabezados de respuesta
Para producir una respuesta desde Middleware, puede:
rewrite
a una ruta (Página o Ruta API Edge) que produzca una respuesta- devolver un
NextResponse
directamente. Consulte Producir una Respuesta
Uso de Cookies
Las cookies son encabezados regulares. En una Request
, se almacenan en el encabezado Cookie
. En una Response
están en el encabezado Set-Cookie
. Next.js proporciona una forma conveniente de acceder y manipular estas cookies a través de la extensión cookies
en NextRequest
y NextResponse
.
- Para solicitudes entrantes,
cookies
viene con los siguientes métodos:get
,getAll
,set
ydelete
cookies. Puede verificar la existencia de una cookie conhas
o eliminar todas las cookies conclear
. - Para respuestas salientes,
cookies
tiene los siguientes métodosget
,getAll
,set
ydelete
.
Establecer Encabezados
Puede establecer encabezados de solicitud y respuesta utilizando la API NextResponse
(establecer encabezados de solicitud está disponible desde Next.js v13.0.0).
Bueno saber: Evite establecer encabezados grandes ya que podría causar un error 431 Campos de Encabezado de Solicitud Demasiado Grandes dependiendo de la configuración de su servidor web backend.
CORS
Puede establecer encabezados CORS en Middleware para permitir solicitudes entre orígenes, incluyendo solicitudes simples y preflight.
Producción de una Respuesta
Puede responder directamente desde el Middleware devolviendo una instancia de Response
o NextResponse
. (Esta funcionalidad está disponible desde Next.js v13.1.0)
waitUntil
y NextFetchEvent
El objeto NextFetchEvent
extiende el objeto nativo FetchEvent
e incluye el método waitUntil()
.
El método waitUntil()
toma una promesa como argumento y extiende la vida útil del Middleware hasta que la promesa se resuelva. Esto es útil para realizar trabajo en segundo plano.
Banderas Avanzadas de Middleware
En la versión v13.1
de Next.js se introdujeron dos banderas adicionales para middleware: skipMiddlewareUrlNormalize
y skipTrailingSlashRedirect
para manejar casos de uso avanzados.
skipTrailingSlashRedirect
desactiva las redirecciones de Next.js para agregar o eliminar barras finales. Esto permite un manejo personalizado dentro del middleware para mantener la barra final en algunas rutas pero no en otras, lo que puede facilitar migraciones incrementales.
skipMiddlewareUrlNormalize
permite desactivar la normalización de URL en Next.js para manejar visitas directas y transiciones del cliente de la misma manera. En algunos casos avanzados, esta opción proporciona control total utilizando la URL original.
Pruebas Unitarias (experimental)
A partir de Next.js 15.1, el paquete next/experimental/testing/server
contiene utilidades para ayudar a probar unitariamente archivos de middleware. Las pruebas unitarias de middleware pueden ayudar a garantizar que solo se ejecute en las rutas deseadas y que la lógica de enrutamiento personalizado funcione como se espera antes de que el código llegue a producción.
La función unstable_doesMiddlewareMatch
se puede utilizar para verificar si el middleware se ejecutará para la URL, encabezados y cookies proporcionados.
También se puede probar toda la función de middleware.
Entorno de Ejecución (Runtime)
El middleware utiliza por defecto el entorno de ejecución Edge (Edge runtime). A partir de la versión v15.2 (canary), tenemos soporte experimental para usar el entorno de ejecución de Node.js (Node.js runtime). Para habilitarlo, agregue la bandera a su archivo next.config
:
Luego, en su archivo de middleware, establezca el entorno de ejecución como nodejs
en el objeto config
:
Nota: Esta característica aún no se recomienda para uso en producción. Por lo tanto, Next.js generará un error a menos que esté utilizando la versión next@canary en lugar de la versión estable.
Soporte de Plataformas
Opción de Despliegue | Soporte |
---|---|
Servidor Node.js | Sí |
Contenedor Docker | Sí |
Exportación estática | No |
Adaptadores | Depende de la plataforma |
Aprenda cómo configurar Middleware al autoalojar Next.js.
Historial de Versiones
Versión | Cambios |
---|---|
v15.2.0 | El middleware ahora puede usar el entorno de ejecución de Node.js (experimental) |
v13.1.0 | Se agregaron banderas avanzadas de middleware |
v13.0.0 | El middleware puede modificar encabezados de solicitud, encabezados de respuesta y enviar respuestas |
v12.2.0 | El middleware es estable, consulte la guía de actualización |
v12.0.9 | Se aplican URLs absolutas en Edge Runtime (PR) |
v12.0.0 | Se agregó Middleware (Beta) |