Files
NightSpire/web-next/middleware.ts
T
Inna 434011624c Barra final solo en la raíz de idioma (/es/), resto de rutas sin barra
trailingSlash true ponía barra en todo (/es/content-creators/). Se pasa a
skipTrailingSlashRedirect + normalización en middleware: raíz de idioma /es → /es/
(con barra), y cualquier sub-ruta con barra final se redirige sin ella
(/es/x/ → /es/x). Sin bucles. Las /api quedan fuera del middleware (sin 308).
El redirect del logout apunta a /es/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 15:36:13 +00:00

34 lines
1.1 KiB
TypeScript

import createMiddleware from 'next-intl/middleware'
import { NextResponse, type NextRequest } from 'next/server'
import { routing } from './i18n/routing'
const intlMiddleware = createMiddleware(routing)
// Raíces de idioma: «/es», «/en». Estas SÍ llevan barra final; el resto NO.
const LOCALE_ROOTS = new Set(routing.locales.map((l) => `/${l}`))
export default function middleware(request: NextRequest) {
const { pathname } = request.nextUrl
// 1) Raíz de idioma sin barra → con barra: /es → /es/
if (LOCALE_ROOTS.has(pathname)) {
const url = new URL(request.url)
url.pathname = `${pathname}/`
return NextResponse.redirect(url)
}
// 2) Sub-ruta con barra final → sin barra (la raíz /es/ se conserva): /es/x/ → /es/x
if (pathname.length > 1 && pathname.endsWith('/') && !LOCALE_ROOTS.has(pathname.slice(0, -1))) {
const url = new URL(request.url)
url.pathname = pathname.replace(/\/+$/, '')
return NextResponse.redirect(url)
}
return intlMiddleware(request)
}
export const config = {
// Aplica a todo salvo /api, estáticos de Next e ipas con extensión.
matcher: ['/((?!api|_next|_vercel|.*\\..*).*)'],
}