Пустой каркас страницы превращается в отрисованную страницу со значком JS
РазработкаТехнический гайд

JavaScript SEO и SSR: как проверить, что поисковик видит страницы

Сайт на React или Vue в браузере выглядит идеально, а в поиске появляются пустые страницы с одинаковым title. Разбираем, что проверить в шаблонах до релиза, чтобы поисковик видел то же, что посетитель.

Автор:
Артём Ярмаркин
Опубликовано
Время чтения
~9 мин чтения
Уровень:
продвинутый
Смотреть услуги
Поделиться:

Расхожая фраза «Google не понимает JavaScript» устарела много лет назад. Google выполняет JavaScript и видит отрисованные страницы. Но рендеринг идёт отдельным этапом со своими ограничениями, и ошибки на нём выглядят иначе, чем на обычных сайтах. Страница в браузере работает, а робот получает пустой шаблон, код 200 на несуществующем товаре или ссылки, по которым нельзя перейти.

Этот материал для маркетолога и руководителя разработки, которые готовят новый сайт или меняют шаблон. Чек-лист переезда мы собрали отдельно. Здесь только про рендеринг и проверки.

Коротко

  • Сравнивайте исходный HTTP-ответ и DOM после выполнения JavaScript: расхождения между ними и есть зона риска.
  • SSR и статическая генерация снимают большую часть рисков, но не лечат медленный сервер, противоречивый canonical или пустой контент.
  • Отдельно проверяйте контент за кликом, выбором города, согласием, авторизацией и бесконечной прокруткой.
  • Несуществующая страница должна отдавать 404, а не шаблон с ответом 200.

Исходный ответ и DOM после JavaScript

Когда браузер запрашивает страницу, сервер отдаёт HTML. Это исходный ответ. Потом выполняются скрипты: загружают данные, строят разметку, меняют заголовки. Результат называется DOM, и именно его видит посетитель. Если сайт построен на клиентском рендеринге, исходный ответ может содержать только пустой контейнер и ссылки на скрипты.

Google обрабатывает такие страницы в три этапа: обход, рендеринг и индексирование. Рендеринг может происходить не сразу после обхода. Всё, что зависит от него, попадает в индекс позже и только если рендеринг прошёл успешно.

CSR, SSR и статическая генерация

ПодходЧто в исходном ответеПлюсыОграничения
CSR (клиентский рендеринг)Пустой шаблон, контент строится в браузереПростая инфраструктура, быстрые переходы внутри приложенияКонтент зависит от рендеринга, ошибки API дают пустую страницу
SSR (серверный рендеринг)Готовый HTML на каждый запросКонтент и метаданные сразу в ответеНагрузка на сервер, медленный бэкенд замедляет каждую страницу
SSG (статическая генерация)Готовый HTML, собранный заранееБыстро и надёжно, легко кэшироватьНужна пересборка или ревалидация при изменении данных
Что получают посетитель и робот

Современные фреймворки позволяют смешивать подходы: каталог генерировать статически, корзину рендерить на клиенте. Выбор зависит от того, как часто меняются данные и сколько стоит поддержка. SSR сам по себе позиции не повышает. Он убирает зависимость от этапа рендеринга. Но если сервер отвечает три секунды, canonical указывает на другую страницу, а контент бесполезен, SSR этого не исправит.

Что проверять в шаблоне

Для каждого типа страниц сравните исходный ответ и отрисованную версию по списку: основной текст, список товаров или материалов, ссылки на другие страницы, title, meta description, canonical, meta robots, структурированные данные. Идеально, когда всё это есть уже в исходном ответе. Допустимо, когда появляется после рендеринга и проверка URL в Search Console это подтверждает.

Опасная ситуация: в исходном HTML одно значение, после рендеринга другое. Например, canonical на главную в исходном ответе и правильный после работы скрипта. Или noindex, который скрипт снимает. Увидев noindex в исходном ответе, Google может вообще не выполнять рендеринг. И не отдавайте роботу контент, отличный по смыслу от того, что видит человек: это клоакинг.

Контент за действием пользователя

Робот не нажимает кнопки, не выбирает город, не принимает cookies и не прокручивает страницу бесконечно. К тому же рендерер Google не сохраняет состояние между загрузками страниц. Поэтому отдельно проверьте:

  • вкладки и аккордеоны, содержимое которых загружается только по клику;
  • окно выбора города, без которого каталог не показывается;
  • баннер согласия на cookies, перекрывающий контент или блокирующий загрузку данных;
  • контент только для авторизованных пользователей;
  • бесконечную прокрутку и кнопку «Показать ещё» без страниц пагинации.

Если контент в DOM есть, но скрыт до клика, обычно всё в порядке. Если он загружается с сервера только по клику, робот его не получит.

Коды ответа, 404 и ошибки API

Классическая ошибка одностраничных приложений: на любой URL сервер отдаёт 200 и пустой шаблон, а сообщение «Товар не найден» рисует скрипт. Для поисковика это мягкая 404 или, хуже, тысячи одинаковых страниц в индексе. Несуществующий адрес должен отдавать 404 на уровне сервера. Если это невозможно, для SPA есть два обходных пути: редирект на URL, который отдаёт 404, или noindex через JavaScript.

Второй риск: ошибка API в момент рендеринга. Каталог временно не получил данные, и робот увидел пустую страницу с кодом 200. При SSR такая ситуация должна давать 5xx, а не пустой HTML с 200: тогда поисковик поймёт, что это временный сбой, и вернётся позже.

Яндекс: настройки отдельно

У Яндекса рендеринг JavaScript управляется настройкой «Рендеринг страниц JavaScript» в разделе «Индексирование» Вебмастера. Функция помечена как бета-версия. По умолчанию робот сам решает, выполнять ли скрипты. Если на сайте есть SSR или пререндеринг, рендеринг лучше запретить: выполнение JavaScript роботом нагружает сервер, а нового робот уже не увидит.

Для сайтов, где контент появляется с задержкой, у Яндекса есть объект window.YandexRotorSettings: через него можно сообщить роботу, когда страница загружена. Есть и неочевидная деталь: вызов window.history.back() робот воспринимает как переход на главную. Если ваш роутер так обрабатывает ошибки, проверьте это отдельно.

Как проверять выборку шаблонов

Возьмите по 3-5 адресов каждого шаблона: главная, категория, карточка товара или услуги, статья, страница фильтра, несуществующий адрес. Для каждого:

  1. посмотрите исходный ответ: curl или «Просмотр кода страницы» в браузере, не инспектор элементов;
  2. откройте страницу с отключённым JavaScript и посмотрите, что осталось;
  3. сделайте живую проверку URL в Search Console и сравните отрисованный HTML со скриншотом;
  4. проверьте ответ сервера в Вебмастере;
  5. краулером с рендерингом и без сравните title, canonical, ссылки и объём текста по всем шаблонам.
НаблюдениеКак проверитьВозможная причинаЗадача
Одинаковый title у многих страниц в индексеИсходный HTML карточекtitle подставляется скриптом после загрузкиОтдавать title в исходном ответе
В индексе нет товаров дальше первой порцииСсылки на страницы пагинации в HTMLТолько кнопка «Показать ещё»Добавить пагинацию с адресами ?page=n
Тысячи страниц «не найдено» в индексеКод ответа несуществующего URL200 на любой адресОтдавать 404 с сервера
Пустые страницы в проверке URLСкриншот и логи API в момент проверкиОшибка или таймаут APISSR с кодом 5xx при сбое, надёжный API
Ссылки не обходятсяНаличие a href в отрисованном HTMLПереходы через onclickПеревести навигацию на ссылки с href
Канонический адрес выбран неверноcanonical в исходном HTML и после рендерингаРазные значенияОдно значение в исходном ответе
Наблюдение → проверка → причина → задача

Условный пример: каталог с кнопкой «Показать ещё»

Пример учебный. Магазин переехал на новый фронтенд. В категории 400 товаров, по 24 на экране, остальные подгружаются кнопкой. Через месяц в индексе карточки только из первых экранов категорий. Проверка показывает: в HTML нет ссылок на следующие порции, кнопка делает запрос к API без смены адреса.

Решение без потери удобства: кнопка остаётся, но каждая порция получает свой адрес вида ?page=2, страницы пагинации отдаются сервером с собственным canonical, а в HTML есть обычные ссылки на них. Посетитель видит ту же кнопку, робот видит цепочку страниц.

Чек-лист QA перед релизом

  • Для каждого шаблона title, description, canonical и robots есть в исходном ответе и совпадают с отрисованной версией.
  • Основной текст и ссылки на другие страницы видны при отключённом JavaScript или подтверждены проверкой URL.
  • Несуществующий адрес отдаёт 404, удалённый товар отдаёт свой код по правилам каталога.
  • При ошибке API страница отдаёт 5xx, а не пустой шаблон с 200.
  • Навигация построена на a href, без переходов только через onclick.
  • Списки с «Показать ещё» дублируются страницами пагинации.
  • Контент не скрыт за выбором города, согласием или авторизацией.
  • Настройка рендеринга в Яндекс Вебмастере соответствует архитектуре сайта.

После релиза

Первые недели после выкладки смотрите на отчёты об индексировании в обеих панелях, статистику обхода, ошибки сервера в логах и число страниц с одинаковыми title. Если резко выросло число исключённых страниц или страниц «просканирована, не проиндексирована», вернитесь к выборке шаблонов. Сроки рендеринга и индексации никто не гарантирует, поэтому сравнивайте с данными до релиза, а не с ожиданиями. Если сайт уже в работе и что-то пошло не так, начните с технического аудита.

Вывод

JavaScript-сайт может индексироваться не хуже классического. Для этого нужно не доверять тому, что видно в браузере, а проверять исходный ответ, коды и ссылки на выборке шаблонов. Лучше всего делать это до релиза, пока исправление стоит часы, а не месяцы потерянного трафика.

Частые вопросы

Не обязательно, но он снимает зависимость индексации от рендеринга и ошибок в браузере робота. Для сайтов, где важен органический трафик, SSR или статическая генерация основных шаблонов обычно надёжнее чистого клиентского рендеринга.

Сам по себе нет. SSR помогает поисковику получить контент без рендеринга. Если проблема была в том, что контент не индексировался, это заметно поможет. Если в медленном сервере или слабом контенте, не поможет.

Живая проверка URL в Search Console показывает отрисованный HTML и скриншот страницы. Сравните его с исходным ответом сервера: если основной текст, ссылки или canonical есть только после рендеринга, страница зависит от этого этапа.

Зависит от архитектуры. Если на сайте есть SSR или пререндеринг, рендеринг лучше запретить. Если контент строится только в браузере, рендеринг нужен. Функция в бета-версии, поэтому результат стоит проверять по статусам страниц.

Поделиться:

Что дальше

Хотите понять, где ваш сайт теряет трафик и заявки?

Начнём с диагностики: посмотрим структуру, техничку, контент, посадочные и аналитику. Покажем узкие места и предложим понятный план работ.

Смотреть услуги