Join our community of websites already using SEOJuice to automate the boring SEO work.
See what our customers say and learn about sustainable SEO that drives long-term growth.
Explore the blog →TL;DR: Astro te da una base sólida de SEO porque pre-renderiza HTML estático y, por defecto, elimina el JavaScript del lado del cliente. Configura site en astro.config.mjs, mantén el contenido indexable fuera de componentes client:only, y configura metadatos únicos, canonicals absolutos, un sitemap y un formato de URL consistente. Luego revisa el HTML generado. Un árbol de componentes “limpio” no demuestra que la página desplegada sea rastreable.
| Prioridad | Comprobación de SEO en Astro | Modo de fallo |
|---|---|---|
| Crítica | Configura site como la URL HTTPS desplegada | Los canonicals, sitemaps, enlaces RSS y URLs de social usan el origen incorrecto o fallan |
| Crítica | Mantén el contenido importante en el HTML renderizado | client:only salta el renderizado en servidor |
| Alta | Usa títulos y descripciones únicos mediante un layout compartido | Las páginas se publican con metadatos faltantes o duplicados |
| Alta | Genera URLs canonical absolutas | Un hostname de previsualización o una ruta inconsistente se convierte en canonical |
| Alta | Instala @astrojs/sitemap | No se genera un sitemap cuando falta site |
| Media | Elige deliberadamente renderizado estático o bajo demanda | Se introduce renderizado en tiempo de solicitud sin una necesidad real |
| Media | Elige una convención de barra final | Los enlaces, redirecciones y canonicals no coinciden |
| Media | Añade metadatos Open Graph, Twitter y RSS cuando corresponda | El indexado funciona, pero compartir y el descubrimiento del feed quedan incompletos |

La parte más fuerte del SEO en Astro no es un paquete de SEO. Es el modelo de renderizado de Astro.
“Por defecto, Astro renderizará automáticamente cada componente de UI a solo HTML y & CSS, eliminando automáticamente todo el JavaScript del lado del cliente.”
Así lo describe la propia Astro en su documentación de arquitectura de Islands. Astro hidrata únicamente los componentes marcados explícitamente para ejecutarse en el navegador y deja el resto de la página como HTML estático.
La diferencia importa porque Google no trata descargar JavaScript y ejecutarlo como la misma operación.
“Google procesa las apps web con JavaScript en tres fases principales: 1. Crawling 2. Rendering 3. Indexing”
Google Search Central también explica que un Chromium sin interfaz (headless) renderiza la página una vez que los recursos de Google lo permiten. Google puede renderizar JavaScript, pero el contenido que existe solo después de la ejecución depende de esa fase adicional. El HTML estático de Astro por defecto elimina esa dependencia porque el contenido relevante ya puede estar presente en la respuesta. Nuestro guía de JavaScript SEO profundiza en el mecanismo.
Esta es una ventaja técnica real. No es una ventaja automática de posicionamiento. El HTML estático no “rescata” páginas ligeras, títulos duplicados, enlaces internos débiles, canonicalizaciones accidentales o contenido que nadie necesita.
Astro ofrece una infraestructura de base excepcional. Pero tú todavía tienes que conectarlo.
Antes de añadir un componente de SEO, configura site en astro.config.mjs:
Configúralo una sola vez en tu Astro config para que canonicals y el sitemap apunten a URLs reales:
// astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com', // habilita URLs canonical y el sitemap
integrations: [sitemap()],
});
| Línea | astro.config.mjs |
|---|---|
| 1 | import { defineConfig } from 'astro/config'; |
| 2 | export default defineConfig({ site: 'https://example.com' }); |
La Configuration Reference de Astro define site como la URL final desplegada y afirma que usa ese valor para generar los URLs del sitemap y las canonicals. El valor predeterminado es undefined y Astro recomienda encarecidamente configurarlo.
Una sola línea controla varios sistemas:
Vimos el “espejo” de esta dependencia durante nuestra migración de seojuice.io a seojuice.com en enero de 2026. Canonicals, entradas del sitemap, URLs de Open Graph y referencias internas tuvieron que converger en un único origen de producción. Una migración deja el problema al descubierto; un site olvidado oculta la misma clase de error dentro de una compilación que, por lo demás, sale bien.
Define la URL de producción, compila y revisa la salida antes de depurar integraciones aguas abajo (un origen, varios síntomas).
Astro no incluye una abstracción especial para metadatos. Los títulos y las descripciones son etiquetas HTML normales. En la mayoría de sitios, el enfoque mantenible es un layout compartido que acepte valores específicos de cada página mediante Astro.props.
| Línea | Layout Astro compartido |
|---|---|
| 1 | --- |
| 2 | const { title, description } = Astro.props; |
| 3 | --- |
| 4 | <head> |
| 5 | <title>{title}</title> |
| 6 | <meta name="description" content={description} /> |
| 7 | </head> |
La primera y la tercera línea son los cercos (frontmatter fences) de Astro. Cada página o entrada de contenido debe aportar su propio título y descripción. Un fallback es útil para detectar datos incompletos, pero no permitas que un valor predeterminado del sitio se convierta silenciosamente en los metadatos de cada URL.
Prefiero validar los metadatos requeridos durante la compilación en lugar de descubrir omisiones en Search Console semanas después. Si una página pública de contenido no tiene título o descripción, hacer fallar la compilación suele ser el comportamiento más “amable”.
El paquete de la comunidad astro-seo puede envolver las etiquetas habituales. Instálalo con npm install astro-seo, importa SEO desde el paquete y renderiza el componente dentro de la cabecera (document head). En su repositorio se listan soportes para títulos, descripciones, canonicals, directivas robots, Open Graph, tarjetas de Twitter, plantillas de título, alternancias de idioma y etiquetas personalizadas.
Seamos precisos: astro-seo es un componente de terceros mantenido por jonasmerlin, no una integración oficial de @astrojs. Yo lo usaría cuando su API elimine repeticiones que realmente importan. Para un sitio de marketing pequeño, un componente head local suele ser más fácil de auditar y más difícil de “quedarse corto” (menos dependencias pueden ser una ventaja, no una preferencia estética).
Open Graph y Twitter Cards son etiquetas meta estándar. Genera todo eso en el mismo componente head compartido para que el título de la página, la descripción, la URL canonical y la imagen no puedan divergir de forma independiente. Las imágenes sociales deberían usar URLs absolutas basadas en Astro.site; las rutas relativas son una causa frecuente de que las previsualizaciones funcionen en un servicio y fallen en otro.
Astro expone los dos valores necesarios para una canonical. Astro.site devuelve una URL basada en el sitio de producción configurado, mientras que Astro.url representa la URL de la solicitud actual.
El API Reference oficial muestra este patrón:
| Línea | Implementación canonical |
|---|---|
| 1 | --- |
| 2 | const canonicalURL = new URL(Astro.url.pathname, Astro.site); |
| 3 | --- |
| 4 | <link rel="canonical" href={canonicalURL} /> |
Esto combina la ruta actual con el origen de producción e impide que un hostname de desarrollo o de previsualización se convierta en canonical solo porque sirvió la petición (los hosts de previsualización no deberían “votar”).
Observa que el patrón usa Astro.url.pathname, no la URL completa de la solicitud. Por tanto, elimina los parámetros de consulta. Normalmente eso está bien para parámetros de tracking y páginas de contenido habituales, pero no es universal. La paginación, colecciones filtradas y páginas realmente distintas parametrizadas necesitan una política canonical explícita.
Una canonical no es un marcador genérico de “SEO activado”. Es una declaración sobre qué URL representa la versión autorizada de una página. Revisa el valor final.
La opción trailingSlash de Astro tiene como valor predeterminado ignore. Las opciones always y never fuerzan una forma para rutas bajo demanda en producción, mientras que el valor predeterminado acepta cualquiera de las dos formas en desarrollo y en renderizado bajo demanda.
En la salida estática, el comportamiento de los archivos generados y del host también afecta el resultado. Elige una forma canónica, genera enlaces internos con esa misma forma y prueba cómo el host desplegado maneja ambos variantes. Cambiar solo la opción de Astro no garantiza que cada host estático aplique las redirecciones que esperas.
El objetivo es el acuerdo: los enlaces internos, las canonicals, las entradas del sitemap y las redirecciones deben apuntar todos a la misma forma de URL. Nuestro guía de SEO para desarrolladores cubre la disciplina más amplia de implementación detrás de esa decisión.
Ejecuta npx astro add sitemap para instalar la integración oficial @astrojs/sitemap de Astro.
Según la documentación oficial del sitemap, la integración necesita la URL del sitio desplegado, empezando con http:// o https://. Sin site, no genera un sitemap.
Después de una compilación, Astro añade sitemap-index.xml y sitemap-0.xml al directorio de salida. El índice referencia los archivos de sitemap numerados. El límite predeterminado es de 45.000 entradas por archivo; a partir de ahí se crean más archivos numerados (45.000 es un umbral de división, no una recomendación para “fabricar” páginas).
Inspecciona varias entradas tras el despliegue. Revisa el protocolo, el hostname, las rutas, la convención de barra y si se colaron páginas privadas o utilitarias. También abre el índice del sitemap y sigue sus enlaces hijos. He visto sitemaps técnicamente válidos desplegados en rutas que nadie había probado.
Un sitemap ayuda al descubrimiento; no fuerza el indexado. Para el resto de ese proceso, consulta cómo funciona el indexado en Google.
Las islands de Astro no son malas para SEO por defecto. Decir eso confunde la hidratación selectiva con el renderizado exclusivamente en el cliente.
La referencia de directivas de Astro dice que client:only “omite el renderizado en servidor de HTML y renderiza solo en el cliente”. Todo lo que haya dentro de ese componente no aparece en el HTML renderizado inicialmente en servidor y depende de la ejecución de JavaScript.
No pongas copias de artículos, descripciones de productos, respuestas de FAQ, navegación principal, enlaces internos ni otro contenido indexable dentro de client:only. Déjalo para interfaces que no pueden renderizar en el servidor y cuyo contenido no necesita aparecer en la respuesta inicial.
client:load, client:idle y client:visible son distintos. Renderizan el HTML inicial en servidor y luego controlan cuándo ocurre la hidratación. El problema no es React, Vue, Svelte o las islands en sí. El problema es saltarse el renderizado en servidor o traer contenido esencial solo al navegador.
Por lo que vemos en los sitios revisados con SEOJuice, el fallo revelador en builds basadas en frameworks de JavaScript a menudo no es un sitemap faltante. Es una página que se ve completa en el navegador mientras que su bloque de texto significativo no está en la respuesta HTML cruda. En Astro, un límite único de client:only es un primer lugar evidente para mirar, aunque la carga de datos solo del navegador también puede producir el mismo resultado.
Yo cometí este error al revisar únicamente la página renderizada. Más precisamente: revisé lo que reconstruyó el navegador, no lo que devolvió el servidor. Ver el código fuente de la respuesta habría terminado la investigación mucho antes. Es el mismo fallo tipo “app-shell” que se trata en nuestras mejores prácticas de SEO para aplicaciones de página única (SPA).
“Por defecto, todo tu sitio Astro se pre-renderizará y se enviarán páginas HTML estáticas al navegador.”
Esto viene de la guía de renderizado bajo demanda de Astro. El modo predeterminado output: 'static' genera páginas en el momento de la compilación. Es la opción directa para documentación, artículos, landing pages y contenido de producto que no dependa de datos específicos de la solicitud.
output: 'server' renderiza bajo demanda y requiere un adaptador para el entorno objetivo, como Node, Netlify, Vercel o Cloudflare. El renderizado en servidor puede devolver HTML completo y no es intrínsecamente peor para SEO. Simplemente añade infraestructura en tiempo de ejecución, latencia y otra superficie de fallo. Úsalo porque la página lo necesita, no porque SSR suene “más capaz”.
Puedes mezclar ambos comportamientos. En modo estático, exporta prerender = false en una página que deba renderizarse bajo demanda. En modo servidor, exporta prerender = true para una página que deba generarse con antelación.
Tutoriales antiguos pueden recomendar output: 'hybrid'. Astro 5 unificó el comportamiento híbrido antiguo dentro de 'static'; la guía de actualización a Astro 5 describe 'hybrid' y 'static' como fusionados en una única configuración estática. Los proyectos actuales deberían usar static o server con overrides de prerender por página.
Astro ofrece el paquete oficial @astrojs/rss para feeds generados mediante endpoints de API. Instálalo con npm install @astrojs/rss y luego crea un endpoint como src/pages/rss.xml.js que devuelva la ayuda (helper) de RSS con site: context.site y los elementos del feed.
La documentación de Astro RSS requiere un site configurado porque ese origen se usa para generar enlaces a artículos. Esta es otra razón para tratar site como configuración base y no como una opción específica del sitemap.
Los componentes de Astro pueden verse correctos mientras que el resultado desplegado esté mal. Compila y despliega, y luego verifica:
Usa “ver código fuente”, solicita la URL sin depender de la ejecución en el navegador, y revisa los archivos desplegados. El panel Elements de DevTools muestra el DOM posterior a la ejecución: es útil, pero responde a una pregunta distinta (a mí todavía me pasa mirar primero el equivocado).
Astro gestiona bien la base del renderizado. El trabajo recurrente es mantener metadatos, enlaces internos, esquema y consistencia de página a medida que el sitio crece. SEOJuice puede ejecutarse sobre Astro mediante un snippet de JavaScript y aplicar continuamente correcciones en el sitio: enlaces internos, títulos y descripciones meta, marcado de schema y texto alternativo de imágenes. El free SEO audit también es una forma sin registro de inspeccionar metadatos y canonicals ya publicados.
No sustituye configurar site, generar un sitemap o mantener el contenido indexable en el HTML inicial. La automatización debería estar encima de una compilación correcta.
Sí. Astro pre-renderiza HTML estático y, por defecto, elimina el JavaScript del lado del cliente, así que el contenido puede estar presente en la respuesta inicial en lugar de depender de la fase de renderizado diferido de JavaScript de Google. El posicionamiento sigue dependiendo de contenido útil, metadatos, enlazado interno, canonicals y otras decisiones de implementación.
Añade etiquetas estándar de title y descripción meta a un layout compartido, y luego pasa valores únicos mediante Astro.props para cada página. El paquete comunitario astro-seo es otra opción, pero no es una integración oficial de Astro.
Ejecuta npx astro add sitemap y configura site como la URL desplegada en astro.config.mjs. Luego, una compilación emite sitemap-index.xml y sitemap-0.xml. Sin la configuración de site, la integración no puede generar el sitemap.
Usa el patrón documentado de Astro: crea una URL con new URL(Astro.url.pathname, Astro.site) y luego emite ese valor en una etiqueta link canonical. Configura site primero porque Astro.site de lo contrario será undefined.
output: 'static' es el valor predeterminado y pre-renderiza páginas a HTML en tiempo de compilación. output: 'server' renderiza bajo demanda y requiere un adaptador. Puedes mezclar el comportamiento por página con prerender = false en modo estático o prerender = true en modo servidor.
Revisa primero site. Por defecto es undefined, mientras que la generación de sitemaps, Astro.site, la construcción de canonicals, los enlaces RSS a artículos y muchas URLs sociales absolutas dependen de ello. Configúralo como el origen final en HTTPS, vuelve a compilar y revisa la salida generada.
no credit card required
No related articles found.