SEO
Xingluo поставляется с полной поддержкой SEO: Open Graph, Twitter Card, canonical, структурированные данные JSON-LD, динамические OG-изображения, RSS, карта сайта и многоязычные объявления hreflang.
Вывод head
<head> в src/layouts/Layout.astro выводит:
charset,viewportfavicon(public/favicon.svg)canonical(каноническая ссылка)title,meta title,meta description,meta author- Ссылка на
sitemap - Open Graph:
og:type,og:site_name,og:title,og:description,og:url,og:image - Twitter Card:
twitter:card,twitter:title,twitter:description,twitter:image - RSS альтернативная ссылка
- hreflang альтернативные ссылки (для каждого языка + x-default)
theme-color(заполняется во время выполненияtheme.ts)google-site-verification(условно)
Метаданные страницы поста
src/layouts/PostLayout.astro внедряет метаданные, специфичные для записи, через <Fragment slot="head">:
og:type = articlearticle:published_time(ISO 8601)article:modified_time(еслиmodDatetimeустановлен)- Структурированные данные JSON-LD
BlogPosting:
json{ "@context": "https://schema.org", "@type": "BlogPosting", "headline": "Заголовок записи", "image": "URL изображения OG", "datePublished": "2026-06-19T10:00:00.000Z", "dateModified": "2026-06-20T10:00:00.000Z", "author": [ { "@type": "Person", "name": "Имя автора", "url": "Домашняя страница автора" } ] }
Нормализация canonical
Каноническая стратегия на страницах деталей записей (PostDetailView.astro):
- Пользовательский
canonicalURLв frontmatter → используется первым - Текущая запись является реальным переводом для этого языка (
localeсовпадает с языком страницы) → указывает на свой собственный URL - Текущая запись является резервным содержимым (нет доступного перевода, используется оригинал) → указывает на оригинальный URL языка по умолчанию
Стратегия 3 гарантирует, что поисковые системы не будут рассматривать страницы без независимых переводов как дублированный контент. Записи с независимыми переводами имеют каноническую ссылку, указывающую на самих себя, и могут индексироваться отдельно.
Структурированные данные BreadcrumbList
Все страницы с хлебными крошками (список записей, индекс тегов, список записей по тегу, архив, о сайте, поиск) автоматически выводят структурированные данные JSON-LD BreadcrumbList:
json{ "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Главная", "item": "https://..." }, { "@type": "ListItem", "position": 2, "name": "Записи", "item": "https://.../posts/" } ] }
Когда последний элемент хлебных крошек не имеет ссылки (текущая страница), URL текущей страницы используется как item. Страницы деталей записей не используют компонент хлебных крошек и поэтому не выводят эти структурированные данные.
Изображения Open Graph
Динамическая генерация
При включённом features.dynamicOgImage (по умолчанию) Xingluo динамически генерирует OG-изображения 1200×630 с помощью satori + sharp:
- Уровень сайта:
src/pages/og.png.ts, для страниц без собственного OG-изображения - Уровень записи:
src/pages/posts/[...slug]/og.png.ts, создаётся только для записей безogImage
Шрифты
OG-изображения используют шрифт Noto Sans SC (см. конфигурацию fonts в astro.config.ts, CSS-переменная --font-og), загружаемый через fontData из astro:assets. Шрифт предназначен только для satori и не внедряется в CSS сайта.
Резервные варианты
- Шрифт недоступен (нет сети) → запасной вариант PNG 1×1 (не приводит к сбою сборки)
dynamicOgImageвыключен → используется статическое изображение OG по умолчанию вpublic/
Разрешение OG-изображения записи
Четырёхуровневый запасной вариант в PostDetailView.astro:
- frontmatter
ogImageявляется строкой → использовать напрямую - frontmatter
ogImageявляется объектомimage()→ использовать.src dynamicOgImageвключён → использовать конечную точкуog.pngна уровне записи- В противном случае → статическое изображение OG сайта по умолчанию
RSS
src/pages/rss.xml.ts генерирует RSS-ленту:
- Заголовок, описание и URL сайта берутся из конфигурации
site - Элементы берутся из
getSortedPosts(черновики и запланированные записи уже отфильтрованы) linkкаждого элемента — этоgetPostUrl(id, filePath, config.site.lang)pubDate— этоmodDatetime ?? pubDatetime
Layout.astro внедряет ссылку автобнаружения RSS:
html<link rel="alternate" type="application/rss+xml" title="..." href=".../rss.xml" />
Карта сайта
Интеграция @astrojs/sitemap (см. astro.config.ts):
filter: фильтрует пути страниц архива на основеfeatures.showArchivesi18n: включает автоматическую генерацию hreflang, сопоставляяzh-cn → zh-CN,en → en, с defaultLocalezh-cn
Генерирует sitemap-index.xml и альтернативные объявления для каждого языка; robots.txt ссылается на карту сайта.
Многоязычные объявления hreflang
Layout.astro выводит <link rel="alternate"> для каждого языка:
html<link rel="alternate" hreflang="zh-CN" href="https://.../posts/welcome/" /> <link rel="alternate" hreflang="en" href="https://.../en/posts/welcome/" /> <link rel="alternate" hreflang="x-default" href="https://.../posts/welcome/" />
Пути нормализуются через parseLocaleFromPath(stripBase(...)) после удаления префиксов, обеспечивая соответствие каждого языка правильному URL. x-default указывает на язык по умолчанию.
robots.txt
src/pages/robots.txt.ts генерирует:
User-agent: * Allow: / Sitemap: https://site-url/sitemap-index.xml
Верификация сайта
Проверка Google Search Console настраивается через site.googleVerification двумя способами:
- Переменная окружения
PUBLIC_GOOGLE_SITE_VERIFICATION(внедрение во время выполнения) - Поле
site.googleVerificationвxingluo.config.ts
Отображается как <meta name="google-site-verification" content="...">.
Похожие статьи
Развертывание
2 мин чтенияРуководство по развертыванию Xingluo, охватывающее платформы статического хостинга (Netlify/Vercel/GitHub Pages), самостоятельный хостинг Nginx, Docker и переменные окружения.
Поиск
1 мин чтенияРуководство по поиску Xingluo, охватывающее интеграцию полнотекстового поиска Flexsearch, генерацию индексов, UI, многоязычный поиск и производительность.