@astrojs/sitemap
Эта интеграция Astro генерирует sitemap на основе ваших страниц при сборке проекта Astro.
Зачем Astro Sitemap
Заголовок раздела «Зачем Astro Sitemap»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 sitemappnpm astro add sitemapyarn astro add sitemapЕсли у вас возникнут какие-либо проблемы, не стесняйтесь сообщать нам о них на GitHub и попробуйте выполнить шаги ручной установки ниже.
Ручная установка
Заголовок раздела «Ручная установка»Сначала установите пакет @astrojs/sitemap с помощью вашего менеджера пакетов.
npm install @astrojs/sitemappnpm add @astrojs/sitemapyarn add @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://.
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.
Пример сгенерированных файлов для сайта из двух страниц
<?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><?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 (discovery)
Заголовок раздела «Обнаружение sitemap (discovery)»Вы можете упростить для роботов поиск sitemap, добавив ссылки в <head> и в robots.txt.
Ссылка на sitemap в <head>
Заголовок раздела «Ссылка на sitemap в <head>»Добавьте элемент <link rel="sitemap"> в <head>, указав индексный файл sitemap:
<head> <link rel="sitemap" href="/sitemap-index.xml" /></head>Ссылка на sitemap в robots.txt
Заголовок раздела «Ссылка на sitemap в robots.txt»Если у вас есть robots.txt, вы можете добавить URL sitemap index, чтобы помочь роботам:
User-agent: *Allow: /
Sitemap: https://<YOUR SITE>/sitemap-index.xmlЕсли вы хотите переиспользовать значение site из astro.config.mjs, вы также можете сгенерировать robots.txt динамически.
Вместо статического файла в public/ создайте 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.
import { defineConfig } from 'astro/config';import sitemap from '@astrojs/sitemap';
export default defineConfig({ integrations: [ sitemap({ // configuration options }), ],});Тип: (page: string) => boolean
По умолчанию все страницы включаются в sitemap. Добавив собственную функцию filter, вы можете фильтровать страницы по URL.
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, чтобы исключить.
Чтобы отфильтровать несколько страниц, добавьте дополнительные условия.
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/', }), ],});customPages
Заголовок раздела «customPages»Тип: string[]
Массив внешне сгенерированных страниц, которые нужно включить в sitemap.
Используйте эту опцию, чтобы добавить в sitemap страницы, которые присутствуют на вашем сайте, но не создаются Astro.
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'], }), ],});customSitemaps
Заголовок раздела «customSitemaps»Тип: string[]
По умолчанию: []
@astrojs/sitemap@3.5.0
Массив внешне сгенерированных sitemap-файлов, которые нужно добавить в sitemap-index.xml вместе со сгенерированными интеграцией записями.
Используйте эту опцию, чтобы включить внешние sitemap в sitemap-index.xml, созданный Astro, для разделов сайта, у которых есть собственные sitemap, не генерируемые Astro. Это удобно, например, когда под одним доменом размещено несколько сервисов.
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'], }), ],});entryLimit
Заголовок раздела «entryLimit»Тип: number
По умолчанию: 45000
Максимальное число записей на один sitemap-файл. По умолчанию 45000. Если записей больше, будет создан индексный файл и несколько sitemap. См. объяснение, как разбивать большой sitemap.
import { defineConfig } from 'astro/config';import sitemap from '@astrojs/sitemap';
export default defineConfig({ site: 'https://example.com', integrations: [ sitemap({ entryLimit: 10000, }), ],});changefreq, lastmod и priority
Заголовок раздела «changefreq, lastmod и priority»Тип: { changefreq?: ChangeFreq; lastmod?: Date; priority?: number; }
@astrojs/sitemap@0.2.0
Эти опции соответствуют тегам <changefreq>, <lastmod> и <priority> в спецификации Sitemap XML.
Обратите внимание: Google игнорирует changefreq и priority.
Из-за ограничений API интеграций Astro, эта интеграция не может анализировать исходный код страниц. Эта опция задает changefreq, lastmod и priority для всего сайта; см. следующую опцию serialize, чтобы задать эти значения для каждой страницы отдельно.
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'), }), ],});serialize
Заголовок раздела «serialize»Тип: (item: SitemapItem) => SitemapItem | Promise<SitemapItem | undefined> | undefined
Функция, которая вызывается для каждой записи sitemap непосредственно перед записью на диск. Может быть асинхронной.
Она получает параметр SitemapItem со следующими свойствами:
url(абсолютный URL страницы). Это единственное гарантированное свойствоSitemapItem.changefreqlastmod(дата в ISO-формате, типString)prioritylinks.
Свойство links содержит список альтернативных страниц LinkItem, включая “родительскую” страницу.
Тип LinkItem имеет два поля: url (полный URL версии этой страницы для указанного языка) и lang (код языка).
Функция serialize должна вернуть SitemapItem (измененный или нет).
Пример ниже показывает, как добавлять sitemap-специфичные свойства индивидуально:
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 по их пути:
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.xmlsitemap-glossary-0.xml
URL, которые не совпадут ни с одним чанком, попадут в файл по умолчанию sitemap-pages-0.xml.
Тип: { defaultLocale: string; locales: Record<string, string>; }
Чтобы локализовать sitemap, передайте объект в опцию i18n.
Этот объект имеет два обязательных свойства:
defaultLocale: его значение должно присутствовать среди ключейlocales.locales: пары ключ/значение. Ключ используется для поиска части locale в пути страницы. Значение - это атрибут языка (допускаются только латинские буквы и дефис).
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 выглядит так:
... <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 для локальной таблицы стилей, либо абсолютной ссылкой на внешнюю таблицу стилей.
import { defineConfig } from 'astro/config';import sitemap from '@astrojs/sitemap';
export default defineConfig({ site: 'https://example.com', integrations: [ sitemap({ xslURL: '/sitemap.xsl' }), ],});filenameBase
Заголовок раздела «filenameBase»Тип: string
По умолчанию: sitemap
@astrojs/sitemap@3.4.0
Префикс имени, используемый при генерации XML sitemap-файлов. По умолчанию sitemap.
Это может быть полезно при интеграции сайта Astro в домен, где уже существуют sitemap-файлы.
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.
namespaces
Заголовок раздела «namespaces»Тип: { 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:
import { defineConfig } from 'astro/config';import sitemap from '@astrojs/sitemap';
export default defineConfig({ site: 'https://example.com', integrations: [ sitemap({ namespaces: { news: false, xhtml: false, } }) ]});Примеры
Заголовок раздела «Примеры»- Официальный сайт Astro использует Astro Sitemap, чтобы генерировать свой sitemap.
- Посмотреть проекты с Astro Sitemap на GitHub