Перейти к содержимому

Эта интеграция Astro генерирует sitemap на основе ваших страниц при сборке проекта Astro.

Sitemap - это XML-файл, который описывает все страницы, видео и файлы на вашем сайте. Поисковые системы, такие как Google, читают этот файл, чтобы эффективнее обходить сайт. Подробнее см. рекомендации Google по sitemap.

Файл sitemap рекомендуется для больших многостраничных сайтов. Даже без sitemap большинство поисковых систем смогут проиндексировать страницы, но sitemap - хороший способ повысить “дружелюбность” сайта для поисковых роботов.

С Astro Sitemap вам не нужно создавать этот XML вручную: интеграция обойдет ваши статически сгенерированные маршруты и создаст sitemap-файл, включая динамические маршруты вида [...slug] или src/pages/[lang]/[version]/info.astro, генерируемые через getStaticPaths().

Эта интеграция не может генерировать записи sitemap для динамических маршрутов в режиме SSR.

Astro включает команду astro add для автоматической настройки официальных интеграций. Если вы предпочитаете, вы можете установить интеграции вручную.

Запустите одну из следующих команд в новом окне терминала.

Окно терминала
npx astro add sitemap

Если у вас возникнут какие-либо проблемы, не стесняйтесь сообщать нам о них на GitHub и попробуйте выполнить шаги ручной установки ниже.

Сначала установите пакет @astrojs/sitemap с помощью вашего менеджера пакетов.

Окно терминала
npm install @astrojs/sitemap

Затем примените интеграцию к вашему файлу astro.config.*, используя свойство integrations:

import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
// ...
integrations: [sitemap()],
});

@astrojs/sitemap нужно знать публичный URL вашего сайта, чтобы сгенерировать sitemap.

Добавьте URL сайта в опцию site в astro.config.mjs. Значение должно начинаться с http:// или https://.

astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [sitemap()],
// ...
});

Когда интеграция sitemap настроена, в выходной директории сборки появятся файлы sitemap-index.xml и sitemap-0.xml.

sitemap-index.xml содержит ссылки на все пронумерованные sitemap-файлы. sitemap-0.xml содержит список страниц сайта. Для очень больших сайтов могут появиться дополнительные файлы, например sitemap-1.xml и sitemap-2.xml.

Пример сгенерированных файлов для сайта из двух страниц
sitemap-index.xml
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://example.com/sitemap-0.xml</loc>
</sitemap>
</sitemapindex>
sitemap-0.xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url>
<loc>https://example.com/</loc>
</url>
<url>
<loc>https://example.com/second-page/</loc>
</url>
</urlset>

Вы можете упростить для роботов поиск sitemap, добавив ссылки в <head> и в robots.txt.

Добавьте элемент <link rel="sitemap"> в <head>, указав индексный файл sitemap:

src/layouts/Layout.astro
<head>
<link rel="sitemap" href="/sitemap-index.xml" />
</head>

Если у вас есть robots.txt, вы можете добавить URL sitemap index, чтобы помочь роботам:

public/robots.txt
User-agent: *
Allow: /
Sitemap: https://<YOUR SITE>/sitemap-index.xml

Если вы хотите переиспользовать значение site из astro.config.mjs, вы также можете сгенерировать robots.txt динамически. Вместо статического файла в public/ создайте src/pages/robots.txt.ts и добавьте следующий код:

src/pages/robots.txt.ts
import type { APIRoute } from 'astro';
const getRobotsTxt = (sitemapURL: URL) => `\
User-agent: *
Allow: /
Sitemap: ${sitemapURL.href}
`;
export const GET: APIRoute = ({ site }) => {
const sitemapURL = new URL('sitemap-index.xml', site);
return new Response(getRobotsTxt(sitemapURL));
};

Чтобы настроить интеграцию, передайте объект в sitemap() в astro.config.mjs.

astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
integrations: [
sitemap({
// configuration options
}),
],
});

Тип: (page: string) => boolean

По умолчанию все страницы включаются в sitemap. Добавив собственную функцию filter, вы можете фильтровать страницы по URL.

astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
filter: (page) => page !== 'https://example.com/secret-vip-lounge/',
}),
],
});

Функция будет вызвана для каждой страницы сайта. Параметр page - это полный URL рассматриваемой страницы, включая домен из site. Верните true, чтобы включить страницу в sitemap, и false, чтобы исключить.

Чтобы отфильтровать несколько страниц, добавьте дополнительные условия.

astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
filter: (page) =>
page !== 'https://example.com/secret-vip-lounge-1/' &&
page !== 'https://example.com/secret-vip-lounge-2/' &&
page !== 'https://example.com/secret-vip-lounge-3/' &&
page !== 'https://example.com/secret-vip-lounge-4/',
}),
],
});

Тип: string[]

Массив внешне сгенерированных страниц, которые нужно включить в sitemap.

Используйте эту опцию, чтобы добавить в sitemap страницы, которые присутствуют на вашем сайте, но не создаются Astro.

astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
customPages: ['https://example.com/external-page1', 'https://example.com/external-page2'],
}),
],
});

Тип: string[]
По умолчанию: []

Добавлено в: @astrojs/sitemap@3.5.0

Массив внешне сгенерированных sitemap-файлов, которые нужно добавить в sitemap-index.xml вместе со сгенерированными интеграцией записями.

Используйте эту опцию, чтобы включить внешние sitemap в sitemap-index.xml, созданный Astro, для разделов сайта, у которых есть собственные sitemap, не генерируемые Astro. Это удобно, например, когда под одним доменом размещено несколько сервисов.

astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
customSitemaps: ['https://example.com/blog/sitemap.xml', 'https://example.com/shop/sitemap.xml'],
}),
],
});

Тип: number
По умолчанию: 45000

Максимальное число записей на один sitemap-файл. По умолчанию 45000. Если записей больше, будет создан индексный файл и несколько sitemap. См. объяснение, как разбивать большой sitemap.

astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
entryLimit: 10000,
}),
],
});

Тип: { changefreq?: ChangeFreq; lastmod?: Date; priority?: number; }

Добавлено в: @astrojs/sitemap@0.2.0

Эти опции соответствуют тегам <changefreq>, <lastmod> и <priority> в спецификации Sitemap XML.

Обратите внимание: Google игнорирует changefreq и priority.

astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
changefreq: 'weekly',
priority: 0.7,
lastmod: new Date('2022-02-24'),
}),
],
});

Тип: (item: SitemapItem) => SitemapItem | Promise<SitemapItem | undefined> | undefined

Функция, которая вызывается для каждой записи sitemap непосредственно перед записью на диск. Может быть асинхронной.

Она получает параметр SitemapItem со следующими свойствами:

  • url (абсолютный URL страницы). Это единственное гарантированное свойство SitemapItem.
  • changefreq
  • lastmod (дата в ISO-формате, тип String)
  • priority
  • links.

Свойство links содержит список альтернативных страниц LinkItem, включая “родительскую” страницу.

Тип LinkItem имеет два поля: url (полный URL версии этой страницы для указанного языка) и lang (код языка).

Функция serialize должна вернуть SitemapItem (измененный или нет).

Пример ниже показывает, как добавлять sitemap-специфичные свойства индивидуально:

astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
serialize(item) {
if (/exclude-from-sitemap/.test(item.url)) {
return undefined;
}
if (/your-special-page/.test(item.url)) {
item.changefreq = 'daily';
item.lastmod = new Date();
item.priority = 0.9;
}
return item;
},
}),
],
});

Тип: Record<string, (item: SitemapItem) => SitemapItem | undefined>

Добавлено в: @astrojs/sitemap@3.7.0 Новое

Карта функций, которая позволяет разбивать sitemap на несколько файлов по собственной логике. Каждый ключ объекта становится именем отдельного sitemap-файла, а соответствующая функция определяет, какие URL попадут в этот “чанк”. Это может быть полезно, например, если конкретный раздел сайта часто меняется, и вы хотите задать другую частоту изменений для его записей.

Каждая функция чанка получает SitemapItem и для каждого item возвращает:

  • измененный SitemapItem, если URL нужно включить в этот чанк
  • undefined, если URL не должен быть включен в этот чанк

Пример ниже показывает, как разделить URL по их пути:

astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
chunks: {
'blog': (item) => {
if (/blog/.test(item.url)) {
item.changefreq = 'weekly';
item.lastmod = new Date();
item.priority = 0.9;
return item;
}
},
'glossary': (item) => {
if (/glossary/.test(item.url)) {
item.changefreq = 'monthly';
item.lastmod = new Date();
item.priority = 0.7;
return item;
}
}
},
}),
],
});

Эта конфигурация сгенерирует файлы:

  • sitemap-blog-0.xml
  • sitemap-glossary-0.xml

URL, которые не совпадут ни с одним чанком, попадут в файл по умолчанию sitemap-pages-0.xml.

Тип: { defaultLocale: string; locales: Record<string, string>; }

Чтобы локализовать sitemap, передайте объект в опцию i18n.

Этот объект имеет два обязательных свойства:

  • defaultLocale: его значение должно присутствовать среди ключей locales.
  • locales: пары ключ/значение. Ключ используется для поиска части locale в пути страницы. Значение - это атрибут языка (допускаются только латинские буквы и дефис).
astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
i18n: {
defaultLocale: 'en', // Все URL, которые не содержат `es` или `fr` после `https://example.com/`, будут считаться локалью по умолчанию, т.е. `en`
locales: {
en: 'en-US', // Значение `defaultLocale` должно присутствовать среди ключей `locales`
es: 'es-ES',
fr: 'fr-CA',
},
},
}),
],
});

Результирующий sitemap выглядит так:

sitemap-0.xml
...
<url>
<loc>https://example.com/</loc>
<xhtml:link rel="alternate" hreflang="en-US" href="https://example.com/"/>
<xhtml:link rel="alternate" hreflang="es-ES" href="https://example.com/es/"/>
<xhtml:link rel="alternate" hreflang="fr-CA" href="https://example.com/fr/"/>
</url>
<url>
<loc>https://example.com/es/</loc>
<xhtml:link rel="alternate" hreflang="en-US" href="https://example.com/"/>
<xhtml:link rel="alternate" hreflang="es-ES" href="https://example.com/es/"/>
<xhtml:link rel="alternate" hreflang="fr-CA" href="https://example.com/fr/"/>
</url>
<url>
<loc>https://example.com/fr/</loc>
<xhtml:link rel="alternate" hreflang="en-US" href="https://example.com/"/>
<xhtml:link rel="alternate" hreflang="es-ES" href="https://example.com/es/"/>
<xhtml:link rel="alternate" hreflang="fr-CA" href="https://example.com/fr/"/>
</url>
<url>
<loc>https://example.com/es/second-page/</loc>
<xhtml:link rel="alternate" hreflang="es-ES" href="https://example.com/es/second-page/"/>
<xhtml:link rel="alternate" hreflang="fr-CA" href="https://example.com/fr/second-page/"/>
<xhtml:link rel="alternate" hreflang="en-US" href="https://example.com/second-page/"/>
</url>
...

Тип: string

Добавлено в: @astrojs/sitemap@3.2.0

URL XSL-таблицы стилей для оформления и “причесывания” sitemap.

Значение может быть либо путем относительно настроенного site для локальной таблицы стилей, либо абсолютной ссылкой на внешнюю таблицу стилей.

astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
xslURL: '/sitemap.xsl'
}),
],
});

Тип: string
По умолчанию: sitemap

Добавлено в: @astrojs/sitemap@3.4.0

Префикс имени, используемый при генерации XML sitemap-файлов. По умолчанию sitemap.

Это может быть полезно при интеграции сайта Astro в домен, где уже существуют sitemap-файлы.

astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
filenameBase: 'astronomy-sitemap'
}),
],
});

Эта конфигурация сгенерирует sitemap-файлы по адресам https://example.com/astronomy-sitemap-0.xml и https://example.com/astronomy-sitemap-index.xml.

Тип: { news?: boolean; xhtml?: boolean; image?: boolean; video?: boolean; }
По умолчанию: { news: true, xhtml: true, image: true, video: true }

Добавлено в: @astrojs/sitemap@3.6.0

Объект XML namespaces, которые нужно исключить из сгенерированного sitemap.

Исключение неиспользуемых namespaces помогает сделать sitemap более “сфокусированным”: поисковикам проще парсить файл, и он потребляет меньше трафика. Например, если у сайта нет новостей, видео или нескольких языков, можно исключить эти namespaces, чтобы уменьшить размер XML.

По умолчанию в sitemap включены все настраиваемые namespaces (news, xhtml, image и video). Чтобы исключить один или несколько namespaces, добавьте объект namespaces и установите отдельные опции в false:

astro.config.mjs
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [
sitemap({
namespaces: {
news: false,
xhtml: false,
}
})
]
});

Дополнительные интеграции

UI-фреймворки

Адаптеры

Другие интеграции