Ejemplos funcionales de proxy.ts para Next.js 16, el archivo que sustituyó a middleware.ts: redirecciones de autenticación, rutas por país, cookies A/B, detección de idioma, matchers y un simulador.
En Next.js 16 el archivo de middleware pasa a ser proxy.ts y exporta una función llamada proxy; middleware.ts está obsoleto y un codemod lo renombra. La función recibe un NextRequest y puede redirigir, reescribir, definir cabeceras o cookies, o devolver una respuesta. Un config.matcher limita las rutas en las que se ejecuta. Ahora usa el runtime de Node.js por defecto.
Qué cambió en Next.js 16
Muchas respuestas en internet siguen describiendo middleware.ts con el runtime Edge. Los ejemplos de aquí usan el nombre de archivo actual, funcionan tal como están escritos y son lo bastante cortos para adaptarlos. Prueba el simulador para ver qué rama de un proxy combinado se activa con una solicitud concreta antes de desplegarlo.
El nombre sí. La versión 16 declara obsoleta la convención del archivo middleware y la renombra a proxy, con las mismas APIs de solicitud y respuesta. Se espera que los archivos middleware.ts antiguos migren, y el codemod oficial renombra tanto el archivo como la función exportada.
El equipo de Next.js dice que la palabra middleware se confundía con el middleware de Express y animaba a abusar de él. Proxy describe una frontera de red delante de la aplicación, y lo recomiendan como último recurso cuando ninguna otra API encaja.
No. Proxy usa Node.js por defecto, y definir la opción de segmento runtime en un archivo proxy lanza un error. Eso también significa que ahora funcionan allí las librerías exclusivas de Node, algo de lo que se quejaba mucha gente con el antiguo middleware solo para Edge.
Solo como primer filtro. La guía de autenticación de Next.js recomienda leer la cookie de sesión en proxy para redirigir rápido y después verificar la sesión otra vez en una capa de acceso a datos, en las Server Actions y en los Route Handlers. Las Server Functions excluidas por el matcher se saltan proxy por completo.
No. La tabla de plataformas de la documentación indica que la exportación estática no es compatible, porque no hay servidor que lo ejecute. Los servidores Node y Docker sí son compatibles, y en otros hostings depende de su adaptador.
Cómo se comportan las rutas de config.matcher
Una comprobación optimista: solo busca la cookie de sesión y recuerda adónde iba el visitante.
El visitante mantiene la URL /pricing pero ve la página de la UE. La cabecera de país que se muestra aquí es la que añade Vercel; otros hostings usan su propio nombre de cabecera.
A cada visitante se le asigna un grupo una sola vez, la cookie lo mantiene en él y una reescritura sirve la variante en la misma URL.
Las rutas que ya empiezan con un locale compatible pasan sin cambios. Todo lo demás se redirige según la primera entrada de Accept-Language que coincida.
Definir las cabeceras dentro de la opción request permite leerlas con headers() en la ruta, sin exponerlas al navegador.
Ejemplo de autenticación: ruta protegida y sin cookie de sesión.
Ejemplo de país: {country} está en la lista de la UE, así que se sirve la página de la UE en la misma URL.
Ejemplo A/B: el visitante está en el grupo {bucket} y una cookie lo mantiene ahí.
Excluida por el matcher de idioma, así que la solicitud continúa sin cambios.
Ejemplo de idioma: la ruta ya tiene un locale compatible.
Ejemplo de idioma: el primer idioma compatible de la cabecera es {locale}.
Define una ruta, una cookie de sesión, un país y un idioma del navegador, y mira si los ejemplos de abajo dejarían pasar la solicitud, la redirigirían o la reescribirían.
Ruta de la solicitud
Cabecera de país (x-vercel-ip-country)
Cabecera Accept-Language
Grupo de la cookie A/B
La solicitud tiene una cookie de sesión
Empieza gratis · Sin tarjeta de crédito