Google recibía dos anotaciones de hreflang que se contradecían
El middleware de next-intl arma los alternates a partir del prefijo de idioma: toma el pathname y le antepone /en. Eso acierta en todas las plantillas que comparten slug y falla justo en la única que lo tiene traducido, /servicios contra /en/services. En /servicios anunciaba por header un /en/servicios que resuelve, pero cuyo canonical apunta a otra URL, así que la misma respuesta se desmentía a sí misma.
return stripIntlAlternateLinks(intlMiddleware(request))
function stripIntlAlternateLinks(response: NextResponse): NextResponse {
const link = response.headers.get('link')
if (!link) return response
const kept = link
.split(/,\s*(?=<)/)
.filter((entry) => !/rel="?alternate"?/i.test(entry))
.join(', ')
if (kept) {
response.headers.set('link', kept)
} else {
response.headers.delete('link')
}
return response
}Una sola anotación, la del head