---
title: "Комплексное создание и проверка многоязычных XML‑карт сайта"
---

# Комплексное создание и проверка многоязычных XML‑карт сайта

Создание XML‑карты сайта — фундаментальная задача для любого сайта, который хочет быть найден поисковыми системами. Когда один и тот же сайт обслуживает контент на нескольких языках, сложность возрастает значительно. Поисковые системы нуждаются в чётких сигналах о языке, региональном таргетинге и взаимосвязи между переводами страниц. В этой статье объясняется, как спроектировать, сгенерировать, проверить и поддерживать многоязычную XML‑карту сайта, отвечающую требованиям Google, Bing и других основных краулеров, при этом автоматизировать процесс для крупномасштабных ресурсов.

## Почему многоязычная карта сайта имеет значение

Поисковые системы рассматривают каждую языковую версию как отдельную страницу. Без явных языковых сигналов фильтры дублирующего контента могут подавлять видимость всех, кроме одной версии. Атрибут **hreflang**, в сочетании с правильно сформированной XML‑картой сайта, сообщает краулерам, какой URL относится к какому языку и региону. Правильная реализация приводит к более высоким показателям кликабельности, более низким показателям отказов и более сильному присутствию в локальных SERP‑ах.

## Основные элементы многоязычной XML‑карты сайта

Корректная многоязычная карта сайта следует стандартной XML‑схеме, но добавляет набор записей `<xhtml:link>` для каждого URL. Необходимые элементы:

* `<url>` — контейнер для одной страницы.  
* `<loc>` — абсолютный URL страницы.  
* `<lastmod>` — дата последнего изменения страницы в формате ГГГГ‑ММ‑ДД.  
* `<xhtml:link>` — одна запись для каждой языковой версии, содержащая `rel="alternate"`, `hreflang` и `href`.

Ниже минимальный пример для страницы, доступной на английском (США) и испанском (Испания).

```xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>https://example.com/en-us/product</loc>
    <lastmod>2026-05-28</lastmod>
    <xhtml:link rel="alternate" hreflang="en-us" href="https://example.com/en-us/product"/>
    <xhtml:link rel="alternate" hreflang="es-es" href="https://example.com/es-es/producto"/>
  </url>
</urlset>
```

Обратите внимание на использование **ISO 639‑1** кодов языков в сочетании с **ISO 3166‑1 alpha‑2** кодами регионов. Такой подход обязателен согласно [документации Google Search Central](https://developers.google.com/search/docs/advanced/crawling/localized-versions).

## Планирование структуры URL‑ов

Прежде чем генерировать карту сайта, решите, как язык и регион будут отражаться в URL‑ах. Два распространённых подхода:

1. **Субдомены** — `en.example.com` и `es.example.com`.  
2. **Префиксы путей** — `example.com/en/` и `example.com/es/`.

Оба варианта допустимы, но префиксы путей упрощают настройку сервера и уменьшают риск проблем с каноническими URL‑ами между доменами. Какой бы способ вы ни выбрали, сохраняйте его постоянным на всём сайте.

## Автоматизация с помощью сборочных инструментов

Большие многоязычные сайты часто содержат тысячи страниц. Редактировать карту сайта вручную становится невозможным. Ниже предложен рабочий процесс, интегрирующий генерацию карты в статический генератор сайта (SSG) или конвейер CI:

1. **Метаданные контента** — храните информацию о языке и регионе во front‑matter каждого файла (например, `lang: en`, `region: US`).  
2. **Скрипт‑генератор карты** — напишите скрипт на предпочитаемом языке (Python, Node.js, Go). Скрипт просматривает каталог контента, читает метаданные и выводит XML‑структуру с правильными записями `<xhtml:link>`.  
3. **Этап проверки** — после генерации прогоните карту через онлайн‑валидатор или утилиту командной строки, например `xmllint`. Зафиксируйте ошибки и прервите CI‑задачу, если проверка не пройдена.  
4. **Развёртывание** — загрузите окончательный `sitemap.xml` в корень сайта и укажите его в файле `robots.txt`.

Ниже — компактный фрагмент Python, демонстрирующий шаги 1‑3. Предполагается, что каждая языковая версия находится в отдельной подпапке.

```python
import os
import xml.etree.ElementTree as ET
from datetime import datetime

BASE_URL = "https://example.com"
CONTENT_ROOT = "./content"

urlset = ET.Element("urlset", {
    "xmlns": "http://www.sitemaps.org/schemas/sitemap/0.9",
    "xmlns:xhtml": "http://www.w3.org/1999/xhtml"
})

def add_url(loc, lastmod, alternates):
    """Добавить запись <url> в карту."""
    url_el = ET.SubElement(urlset, "url")
    ET.SubElement(url_el, "loc").text = loc
    ET.SubElement(url_el, "lastmod").text = lastmod
    for hreflang, href in alternates.items():
        ET.SubElement(url_el, "xhtml:link", {
            "rel": "alternate",
            "hreflang": hreflang,
            "href": href
        })

# Обходим дерево контента и собираем информацию о страницах
for root, dirs, files in os.walk(CONTENT_ROOT):
    # Пример: ./content/en/product.md, ./content/es