Выберите язык

Комплексное создание и проверка многоязычных 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 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.

Планирование структуры 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. Предполагается, что каждая языковая версия находится в отдельной подпапке.

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
Вверх
© Scoutize Pty Ltd 2025. All Rights Reserved.