Что входит в Technical SEO?

MiddleSEO #seo #technical-seo

Вопрос

Какие технические аспекты сайта относятся к SEO (robots.txt, sitemap, canonical, structured data) и почему способ рендеринга (SSR/SSG против чистого CSR) критически влияет на индексацию?

Короткий ответ

Technical SEO — это настройка инфраструктуры сайта так, чтобы поисковые боты могли эффективно его обходить и корректно интерпретировать: robots.txt управляет доступом бота, sitemap.xml подсказывает список URL, canonical устраняет дубли, structured data (JSON-LD) явно описывает тип контента. Отдельно стоит способ рендеринга — SPA без SSR/SSG отдаёт боту почти пустой HTML, что ухудшает и замедляет индексацию по сравнению с SSR/SSG-подходом, который использует, например, Nuxt.

Подробный ответ

robots.txt — текстовый файл в корне домена, который указывает ботам, какие разделы сайта не нужно обходить (например, админку, страницы поиска с дублирующимся контентом, тестовые окружения). Важно: robots.txt запрещает обход, а не индексацию — если на закрытую в robots.txt страницу ведут внешние ссылки, она всё равно может попасть в индекс (просто без содержимого). Для гарантированного исключения из индекса нужен meta robots noindex или HTTP-заголовок X-Robots-Tag.

sitemap.xml — XML-файл со списком URL сайта, датами обновления и приоритетами. Не гарантирует индексацию, но ускоряет обнаружение новых/изменённых страниц, особенно на крупных или редко перелинкованных сайтах. Указывается в robots.txt через Sitemap: и/или добавляется в Google Search Console.

canonical (<link rel="canonical">) — указывает "основную" версию страницы, когда один и тот же контент доступен по нескольким URL (фильтры каталога, UTM-метки, http vs https, с www и без). Без canonical поисковик может распылить ранжирующий вес между дублями или сам выбрать "не ту" версию.

Structured data (JSON-LD / schema.org) — явная машиночитаемая разметка типа контента (статья, товар, отзыв, FAQ, хлебные крошки), встраиваемая в <script type="application/ld+json">. Не влияет на позиции напрямую, но открывает доступ к rich results — расширенным сниппетам (звёзды рейтинга, цена, FAQ-раскрывашки), которые заметно увеличивают CTR.

SSR/SSG против CSR — критический момент technical SEO для современных JS-фреймворков:

  • В чистом CSR (Client-Side Rendering) сервер отдаёт почти пустой <div id="app"></div>, а весь контент рендерится в браузере после загрузки и выполнения JS. Googlebot технически умеет выполнять JS (двухфазный краулинг: сначала HTML, затем рендеринг очередью через WRS), но это медленнее, требует больше ресурсов от бота и не гарантирует, что каждый бот (не только Google) сможет корректно дождаться рендера.
  • SSR (Server-Side Rendering) рендерит HTML на сервере при каждом запросе — бот получает полностью готовый контент сразу, без выполнения JS.
  • SSG (Static Site Generation) генерирует готовый HTML на этапе сборки — максимально быстрая отдача и индексация, подходит для контента, не меняющегося при каждом запросе.

Nuxt по умолчанию использует SSR (или гибридный nuxt generate для SSG), что снимает с разработчика необходимость решать эту проблему вручную, в отличие от "голого" SPA на Vue/React без соответствующей настройки.

Пример

# robots.txt
User-agent: *
Disallow: /admin/
Disallow: /search
Allow: /

Sitemap: https://example.com/sitemap.xml
<!-- canonical: у товара есть версии с UTM-метками и сортировкой,
     но каноничной должна считаться "чистая" версия -->
<link rel="canonical" href="https://shop.example.com/nike-air-max" />
<!-- JSON-LD: структурированные данные для товара -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Nike Air Max 90",
  "image": "https://shop.example.com/img/air-max-90.jpg",
  "offers": {
    "@type": "Offer",
    "priceCurrency": "RUB",
    "price": "12990",
    "availability": "https://schema.org/InStock"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.7",
    "reviewCount": "128"
  }
}
</script>
// Nuxt Content: пример sitemap.xml через nuxt-simple-sitemap / @nuxtjs/sitemap
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxtjs/sitemap'],
  site: {
    url: 'https://example.com'
  }
})

Дополнительные вопросы

  • В чём разница между robots.txt Disallow и meta robots noindex?
  • Как Googlebot рендерит JavaScript и почему это не решает проблему CSR полностью?
  • Когда лучше использовать SSG вместо SSR с точки зрения SEO и производительности?