SEO
Xingluo viene con soporte SEO completo: Open Graph, Twitter Card, canonical, datos estructurados JSON-LD, imágenes OG dinámicas, RSS, sitemap y declaraciones multilingües hreflang.
Salida del head
El <head> en src/layouts/Layout.astro genera:
charset,viewportfavicon(public/favicon.svg)canonical(enlace canónico)title,meta title,meta description,meta author- Enlace
sitemap - Open Graph:
og:type,og:site_name,og:title,og:description,og:url,og:image - Twitter Card:
twitter:card,twitter:title,twitter:description,twitter:image - RSS enlace alternativo
- hreflang enlaces alternativos (por idioma + x-default)
theme-color(rellenado en tiempo de ejecución portheme.ts)google-site-verification(condicional)
Metadatos de página de artículo
src/layouts/PostLayout.astro inyecta metadatos específicos del artículo mediante <Fragment slot="head">:
og:type = articlearticle:published_time(ISO 8601)article:modified_time(simodDatetimeestá establecido)- Datos estructurados JSON-LD
BlogPosting:
json{ "@context": "https://schema.org", "@type": "BlogPosting", "headline": "Título del artículo", "image": "URL de imagen OG", "datePublished": "2026-06-19T10:00:00.000Z", "dateModified": "2026-06-20T10:00:00.000Z", "author": [ { "@type": "Person", "name": "Nombre del autor", "url": "Página de inicio del autor" } ] }
Normalización canonical
La estrategia canonical en las páginas de detalle de artículo (PostDetailView.astro):
canonicalURLpersonalizado en frontmatter → usado primero- El artículo actual es una traducción real para este idioma (
localecoincide con el idioma de la página) → apunta a su propia URL - El artículo actual es contenido de respaldo (no hay traducción disponible, se usa el original) → apunta a la URL original en el idioma predeterminado
La estrategia 3 garantiza que los motores de búsqueda no traten las páginas sin traducciones independientes como contenido duplicado. Los artículos con traducciones independientes tienen canonical que apunta a sí mismos y pueden indexarse por separado.
Datos estructurados BreadcrumbList
Todas las páginas con migas de pan (lista de artículos, índice de etiquetas, lista de etiquetas, archivos, acerca de, búsqueda) generan automáticamente datos estructurados BreadcrumbList JSON-LD:
json{ "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Inicio", "item": "https://..." }, { "@type": "ListItem", "position": 2, "name": "Artículos", "item": "https://.../posts/" } ] }
Cuando el último elemento de la miga de pan no tiene enlace (página actual), la URL de la página actual se usa como item. Las páginas de detalle de artículo no usan el componente de migas de pan y por lo tanto no generan estos datos estructurados.
Imágenes Open Graph
Generación dinámica
Con features.dynamicOgImage activado (predeterminado), Xingluo genera dinámicamente imágenes OG de 1200×630 usando satori + sharp:
- Nivel de sitio:
src/pages/og.png.ts, para páginas sin una imagen OG personalizada - Nivel de artículo:
src/pages/posts/[...slug]/og.png.ts, generado solo para artículos sinogImage
Fuentes
Las imágenes OG usan Noto Sans SC (ver la configuración fonts en astro.config.ts, variable CSS --font-og), cargada mediante fontData de astro:assets. La fuente es solo para satori y no se inyecta en el CSS del sitio.
Respaldos
- Fuente no disponible (sin red) → retrocede a un PNG de marcador de posición 1×1 (no falla la compilación)
dynamicOgImagedesactivado → usa la imagen OG estática predeterminada bajopublic/
Resolución de imagen OG de artículo
El respaldo de cuatro niveles en PostDetailView.astro:
ogImagedel frontmatter es una cadena → usar directamenteogImagedel frontmatter es un objetoimage()→ usar.srcdynamicOgImageactivado → usar el punto finalog.pnga nivel de artículo- De lo contrario → imagen OG estática predeterminada del sitio
RSS
src/pages/rss.xml.ts genera el feed RSS:
- El título, la descripción y la URL del sitio provienen de la configuración
site - Los elementos provienen de
getSortedPosts(borradores y artículos programados ya filtrados) - El
linkde cada elemento esgetPostUrl(id, filePath, config.site.lang) pubDateesmodDatetime ?? pubDatetime
Layout.astro inyecta el enlace de autodescubrimiento RSS:
html<link rel="alternate" type="application/rss+xml" title="..." href=".../rss.xml" />
Sitemap
La integración @astrojs/sitemap (ver astro.config.ts):
filter: filtra las rutas de páginas de archivo segúnfeatures.showArchivesi18n: habilita la generación automática de hreflang, mapeandozh-cn → zh-CN,en → en, con defaultLocalezh-cn
Genera sitemap-index.xml y declaraciones alternativas por idioma; robots.txt referencia el sitemap.
Declaraciones multilingües hreflang
Layout.astro genera <link rel="alternate"> para cada idioma:
html<link rel="alternate" hreflang="zh-CN" href="https://.../posts/welcome/" /> <link rel="alternate" hreflang="en" href="https://.../en/posts/welcome/" /> <link rel="alternate" hreflang="x-default" href="https://.../posts/welcome/" />
Las rutas se normalizan mediante parseLocaleFromPath(stripBase(...)) después de eliminar prefijos, asegurando que cada idioma se asigne a la URL correcta. x-default apunta al idioma predeterminado.
robots.txt
src/pages/robots.txt.ts genera:
User-agent: * Allow: / Sitemap: https://site-url/sitemap-index.xml
Verificación del sitio
La verificación de Google Search Console se configura mediante site.googleVerification de dos maneras:
- Variable de entorno
PUBLIC_GOOGLE_SITE_VERIFICATION(inyección en tiempo de ejecución) - El campo
site.googleVerificationenxingluo.config.ts
Se renderiza como <meta name="google-site-verification" content="...">.
Artículos relacionados
Despliegue
2 min de lecturaGuía de despliegue de Xingluo que cubre plataformas de alojamiento estático (Netlify/Vercel/GitHub Pages), autoalojamiento Nginx, Docker y variables de entorno.
Búsqueda
1 min de lecturaGuía de búsqueda de Xingluo que cubre la integración de búsqueda de texto completo Flexsearch, generación de índices, UI, búsqueda multilingüe y rendimiento.