Avatar byandrev

byandrev

Cómo crear un sitemap manualmente en Astro

4min de lectura

Un sitemap es una lista de las páginas de un sitio web dentro de un dominio. Este normalmente lo puedes encontrar en las paginas como www.dominio.com/sitemap.xml. Lo utilizan comúnmente los rastreadores web, como los motores de búsqueda para indexar paginas webs.

Estructura de un sitemap

El sitemap es un archivo xml que contiene listas de enlaces de todos los sitios webs de un dominio. Estos contienen la URL de estas páginas para que los rastreadores web puedan encontrarlas por ejemplo DuckDuckGo, Google, Yahoo, etc.

Estructura de un sitio web y su sitemap

Estructura de un sitio web y su sitemap

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>http://www.yourdomain.com/</loc>
        <lastmod>2025-09-02</lastmod>
    </url>
</urlset>

En la estructura del sitemap cada URL debe ir dentro de la etiqueta <url>, donde definimos la URL de la pagina es en la etiqueta <loc> y en <lastmod> la ultima actualización que se le hizo a la pagina.

Generar sitemap en Astro

Para generar nuestro sitemap en Astro de forma manual debemos crear un archivo llamado sitemap.xml.ts o sitemap.xml.js y exportar una función GET de la siguiente manera:

export async function GET() {
  const siteUrl = import.meta.env.SITE;

  const result = `
  <?xml version="1.0" encoding="UTF-8"?>
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>${siteUrl}/</loc>
    </url>
  </urlset>
  `.trim();

  return new Response(result, {
    headers: {
      "Content-Type": "application/xml",
    },
  });
}

También es importante recordar que Astro cuenta con la integración @astrojs/ sitemap que genera el sitemap automáticamente, la generación del sitemap de forma manual solo es necesario cuando hay paginas SSR y por lo tanto necesitamos generar nuestro propio sitemap.

Y muy importante agregar el siguiente link al head de todas nuestra paginas, este dice en que ruta estará nuestro sitemap.xml:

<link rel="sitemap" href="/sitemap.xml" />

Ahora veamos un ejemplo mas practico, construiremos el sitemap agregando las paginas de los artículos publicados de un blog.

import { getPosts } from "@/lib/posts";

export async function GET() {
  const siteUrl = import.meta.env.SITE;
  const posts = await getPosts();

  const result = `
  <?xml version="1.0" encoding="UTF-8"?>
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
      <url>
        <loc>${siteUrl}/</loc>
      </url>

    ${posts
      .map((post) => {
        const lastMod = post.updatedAt ?? post.createdAt;

        return `<url>
            <loc>${siteUrl}/blog/${post.slug}/</loc>
            <lastmod>${lastMod}</lastmod>
        </url>`;
      })
      .join("\n")}

  </urlset>
  `.trim();

  return new Response(result, {
    headers: {
      "Content-Type": "application/xml",
    },
  });
}

El código anterior generará algo parecido a esto:

Screenshot del sitemap del ejemplo en Astro

Ejemplo de un sitemap

Referencias


Avatar byandrev

Andres Parra

Soy Andrés Parra, Ingeniero de Sistemas. Me especializo en desarrollo web Full Stack y lidero el RPCIDE, un editor de código online para programación competitiva. Trabajo con tecnologías como React, Node.js, Python y bases de datos SQL/NoSQL. También soy entusiasta de competiciones de programación y proyectos de código abierto. Ver todos los posts

Comparte este artículo en