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>
24 lines
1.0 KiB
TypeScript
24 lines
1.0 KiB
TypeScript
import { NextResponse } from 'next/server'
|
|
import { getSession } from '@/lib/session'
|
|
import { routing } from '@/i18n/routing'
|
|
|
|
/**
|
|
* Cierra la sesión y redirige al inicio del idioma. Es una ruta visitable
|
|
* (/es/log-out, /en/log-out): destruye la cookie de sesión y manda a «/{locale}».
|
|
*
|
|
* Se usa un `Location` RELATIVO (no `request.url`): detrás del proxy inverso
|
|
* (Caddy) `request.url` trae la dirección interna (localhost:3001), lo que hacía
|
|
* que el redirect apuntara a localhost. Con una ruta relativa el navegador la
|
|
* resuelve contra el dominio público real.
|
|
*/
|
|
export async function GET(_request: Request, { params }: { params: Promise<{ locale: string }> }) {
|
|
const { locale } = await params
|
|
const loc = routing.locales.includes(locale as (typeof routing.locales)[number]) ? locale : routing.defaultLocale
|
|
|
|
const session = await getSession()
|
|
session.destroy()
|
|
|
|
// La raíz de idioma es canónica CON barra (/es/); el resto de rutas sin barra.
|
|
return new NextResponse(null, { status: 303, headers: { Location: `/${loc}/` } })
|
|
}
|