Parte 8 de 11
SEO on-page
Meta tags, Open Graph, sitemap, robots.txt y JSON-LD para que la web aparezca bien en buscadores y redes.
Una web estática ya parte con ventaja en SEO: es HTML real, sin JavaScript que Google tenga que ejecutar. Aun así, hay que darle los datos que los buscadores y las redes sociales esperan.
Meta básica en el layout
Cada página define su title y description, y el layout los aplica:
<title>{pageTitle}</title>
<meta name="description" content={pageDescription} />
<link rel="canonical" href={pageUrl} />
El <title> y la description son lo que se ve en los resultados de Google. La canonical evita contenido duplicado.
Open Graph y Twitter Card
Esto es lo que dibuja la “tarjeta” cuando compartes el enlace en WhatsApp, LinkedIn o Twitter:
<meta property="og:type" content="website" />
<meta property="og:title" content={pageTitle} />
<meta property="og:description" content={pageDescription} />
<meta property="og:url" content={pageUrl} />
<meta property="og:locale" content="es_ES" />
<meta property="og:image" content="https://tudominio.com/og.png" />
<meta name="twitter:card" content="summary_large_image" />
La imagen og.png (1200×630) es la miniatura que aparece al compartir.
Sitemap con la integración de Astro
Con site definido en astro.config.mjs, la integración @astrojs/sitemap genera el sitemap automáticamente en cada build:
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://tudominio.com',
integrations: [sitemap()],
});
robots.txt dinámico
En vez de un archivo fijo, lo generé con una pequeña ruta para que la URL del sitemap se adapte a la base:
// src/pages/robots.txt.ts
export function GET() {
const site = 'https://tudominio.com';
const body = `User-agent: *\nAllow: /\n\nSitemap: ${site}/sitemap-index.xml\n`;
return new Response(body, { headers: { 'Content-Type': 'text/plain' } });
}
Datos estructurados con JSON-LD
Un bloque en el <head> que le dice a Google quién soy, de forma explícita:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Tu Nombre",
"jobTitle": "Desarrollador",
"url": "https://tudominio.com",
"email": "mailto:hola@tudominio.com",
"sameAs": [
"https://github.com/tu-usuario",
"https://www.linkedin.com/in/tu-usuario/"
]
}
</script>
Este JSON-LD se rellena desde variables de entorno, así el repo tampoco contiene aquí datos personales.
En la siguiente parte, subimos la web al mundo con GitHub Pages.