Как создать мультиязычные карты сайта в React Router v7

Организуйте карты сайта по языкам для масштабирования

Проблема

Карты сайта помогают поисковым системам находить и сканировать все страницы на сайте. Многоязычный сайт с сотнями или тысячами страниц на каждом языке может быстро создавать огромные карты сайта. Один файл, содержащий все URL-адреса для каждого языка, становится громоздким, может превышать лимиты в 50 000 URL-адресов или 50 МБ, и усложняет обслуживание. Когда вы обновляете структуру одного языка, вам нужно заново генерировать и проверять весь файл. Такой подход не масштабируется по мере роста вашего сайта.

Решение

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

Шаги

1. Создайте маршрут индекса карты сайта

Создайте маршрут ресурса, который возвращает XML-ответ с перечислением всех карт сайта для каждого языка.

import type { Route } from "./+types/sitemap";

const LOCALES = ["en", "es", "fr", "de"];

export function loader({ request }: Route.LoaderArgs) {
const { origin } = new URL(request.url);

const sitemapIndex = `<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
${LOCALES.map(locale => `  <sitemap>
  <loc>${origin}/sitemap-${locale}.xml</loc>
</sitemap>`).join("
")}
</sitemapindex>`;

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

Этот маршрут работает как конечная точка API, возвращая XML-ответ. Индекс перечисляет одну карту сайта на каждый язык, что упрощает добавление или удаление языков путем обновления массива LOCALES.

2. Создайте маршруты карты сайта для каждого языка

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

import type { Route } from "./+types/sitemap.$locale";

export async function loader({ params }: Route.LoaderArgs) {
const locale = params.locale;
const urls = await getUrlsForLocale(locale);

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

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

async function getUrlsForLocale(locale: string): Promise<string[]> {
return [];
}

Динамический сегмент в пути маршрута анализируется и передается как params.locale. Каждая языковая карта сайта содержит только URL-адреса для соответствующего языка.

3. Получите страницы для каждого языка

Реализуйте вспомогательную функцию для получения всех страниц для заданного языка из вашего источника данных.

async function getUrlsForLocale(locale: string): Promise<string[]> {
  const pages = await db.pages.findMany({
    where: { locale, published: true },
    select: { slug: true },
  });

  return pages.map((page) => `https://example.com/${locale}/${page.slug}`);
}

Эта функция выполняет запрос к вашей базе данных или источнику контента для опубликованных страниц на запрашиваемом языке и создает полные URL-адреса. Настройте запрос и структуру URL в соответствии с вашим приложением.

4. Зарегистрируйте маршруты карты сайта

Добавьте маршруты карты сайта в файл конфигурации маршрутов.

import { type RouteConfig, route } from "@react-router/dev/routes";

export default [
  route("sitemap.xml", "./routes/sitemap.tsx"),
  route("sitemap-:locale.xml", "./routes/sitemap.$locale.tsx"),
] satisfies RouteConfig;

Каждый маршрут имеет шаблон URL для сопоставления и путь к модулю маршрута. Индексный маршрут отвечает на /sitemap.xml, а языковые маршруты отвечают на /sitemap-en.xml, /sitemap-es.xml и так далее.

5. Добавьте индекс карты сайта в robots.txt

Укажите поисковым системам на индекс карты сайта в файле robots.txt, который находится в корневом каталоге вашей публичной директории.

User-agent: *
Allow: /

Sitemap: https://example.com/sitemap.xml

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