434011624c
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>
34 lines
1.1 KiB
TypeScript
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|.*\\..*).*)'],
|
|
}
|