El contenido duplicado puede provocar ambigüedad de indexación en sitios multilingües y en páginas con parámetros. Dos mecanismos ayudan a gestionarlo.
Canonical señala la URL preferida
Indica a los buscadores qué URL es la preferida cuando varias direcciones sirven el mismo contenido (parámetros de seguimiento, barras finales, paginación):
export async function generateMetadata({ params }): Promise<Metadata> {
return {
alternates: {
canonical: `/blog/${params.slug}`,
},
};
}
hreflang conecta las versiones de idioma
Indica a los buscadores qué versiones de idioma existen y ayuda a elegir la correcta. La forma de obtener las direcciones depende del modelo de contenido; el ejemplo supone que getLocalizedUrls() devuelve la URL real de cada versión:
export async function generateMetadata({ params }): Promise<Metadata> {
const { lang } = params;
const localizedUrls = await getLocalizedUrls(params);
return {
alternates: {
canonical: localizedUrls[lang],
languages: {
...localizedUrls,
"x-default": localizedUrls.en,
},
},
};
}
Errores de implementación habituales
- hreflang debe ser recíproco. Si la página EN apunta a la versión PL, la página PL debe apuntar de vuelta a EN; si no, Google puede ignorar todo el grupo.
- Cada página debe incluirse a sí misma en el mapa
languages. - Slugs localizados: si la entrada en polaco vive bajo otro slug, hreflang debe apuntar a la URL localizada real, no al mecánico
/pl/+ el mismo slug. Genere el mapa desde la fuente de contenido, no lo escriba a mano. x-defaultatiende a los usuarios cuyo idioma no admite: diríjalo a la ubicación principal.- El canonical debe llevar a una página que devuelva 200 y sin
noindex: un canonical a una URL que redirige se ignora.
Checklist:
- Canonical autorreferente en cada página indexable
- hreflang generado a partir de slugs localizados reales, recíproco en todas las direcciones
-
x-defaultpresente - Parámetros de URL (utm, filtros, orden) canonicalizados a la dirección limpia
