Переезд сайта с React на статический Astro: как я переносил 240 страниц и что проверял

Свой сайт я перевёл с React-приложения на статическую сборку. Рассказываю, зачем это было нужно, как я составлял карту адресов, проверял каждую страницу до и после выкладки и почему выкладка откатывается сама, если что-то сломалось.

Сайт nasloy.ru несколько лет работал как React-приложение. Человеку это было незаметно, а роботам заметно: сервер отдавал почти пустую страницу, и текст появлялся только после выполнения JavaScript. Google с этим справлялся, хоть и с задержкой. Яндекс и роботы нейросетей — заметно хуже. В октябре 2026 года я перевёл сайт на статическую сборку Astro. Ниже — как был устроен переезд и что я проверял на каждом шаге.

Зачем переезжать, если сайт работает

Сайт работал, но три вещи мешали всё сильнее:

  • Контент не в HTML. Роботы, которые не выполняют JavaScript, видели пустой каркас. Для сайта, который продаёт SEO и GEO, это неприемлемо.
  • Каждая страница зависела от общего бандла. Правка одного текста требовала пересборки всего приложения.
  • Скорость. Браузеру нужно было скачать и выполнить скрипты, прежде чем показать текст.

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

Старый и новый сайт стоят на разных берегах. Мост между ними — карта адресов

Шаг 1. Инвентаризация: что вообще есть на сайте

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

Тексты услуг, статьи, кейсы и уроки я вынес в отдельные файлы с данными, отделив их от шаблонов

— Олег Ветров, автор блога
ИсточникЧто даётЧто в нём не найти
Карта сайта старой версииОфициальный список страницСтраницы, которые забыли туда добавить
Search Console и ВебмастерАдреса, которые поисковики знают и показываютСтраницы без показов
Внешние ссылкиАдреса, на которые ссылаются другие сайтыВнутренние страницы без ссылок

Получилось около 240 страниц: услуги, отраслевые страницы, блог, инструменты, исследования, кейсы, академия. Для каждого адреса я записал тип страницы и решение: переносится как есть, переносится с новым адресом или объединяется с другой страницей.

Шаг 2. Адреса не меняются без причины

Главное правило переезда: адрес страницы меняется только тогда, когда без этого нельзя. Каждый новый адрес — это редирект, переобход и несколько недель, пока поисковик переносит накопленные сигналы. Поэтому новая сборка сохранила прежнюю схему адресов: без слэша на конце, с теми же путями для услуг, блога и инструментов.

Каждый старый адрес ведёт ровно на один новый — без цепочек и тупиков

Там, где адрес всё же менялся, я ставил постоянный редирект 301 сразу на конечную страницу. Пример: одно большое исследование рынка раньше жило в блоге, а теперь переехало в раздел исследований. Старый адрес ведёт прямо на новый, без промежуточных шагов. Цепочка из двух–трёх редиректов работает, но каждый лишний шаг замедляет переобход.

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

Шаг 3. Проверка до выкладки

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

  • каждый адрес из старой карты отвечает кодом 200 или ведёт редиректом на рабочую страницу;
  • у каждой страницы есть title, description и ровно один заголовок H1;
  • нет одинаковых title и description у разных страниц;
  • canonical указывает на саму страницу, а не на главную;
  • внутренние ссылки ведут на существующие страницы;
  • основной текст есть в HTML без выполнения JavaScript;
  • на ширине телефона страница не шире экрана.

Проверку делает скрипт, и занимает она минуты. Вручную такой объём просто не проверить: на десятой странице внимание уже расплывается.

Шаг 4. Выкладка, которая сама откатывается

Самый нервный момент переезда — замена рабочего сайта. Я сделал её так, чтобы ошибка не успела повредить:

Новая версия встаёт на место старой, но старая остаётся рядом — на случай отката
  1. Новая сборка готовится рядом с рабочей, не трогая её.
  2. Рабочая версия сохраняется копией, а новая встаёт на её место за секунду.
  3. Сразу после замены скрипт проверяет ключевые адреса на живом сайте.
  4. Если хоть одна проверка не прошла, старая версия автоматически возвращается на место.

С тех пор так устроена каждая публикация на сайте, не только переезд. Каждая новая статья проходит тот же путь: сборка, проверка, замена, контрольная проверка.

Что нашлось после запуска

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

Что проверялРезультат
Код ответа всех страниц из sitemapВсе 200
Битые внутренние ссылкиНе найдено
Дубли title и descriptionНе найдено
Битые изображения13 в 9 старых статьях блога — ссылки на файлы, которых не было и на старом сайте
Двойное экранирование символовПодписи к иллюстрациям выводили «&» — ошибка шаблона

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

Переезд не создаёт новые ошибки так часто, как вытаскивает на свет старые.

Чек-лист переезда

  1. Собрать все адреса старого сайта из карты, панелей вебмастеров и внешних ссылок.
  2. Для каждого адреса решить: переносится, меняется или объединяется.
  3. Сохранить схему адресов, если нет веской причины её менять.
  4. Для изменённых адресов поставить 301 сразу на конечную страницу.
  5. Перенести тексты как данные и сверить построчно.
  6. Проверить всю новую сборку скриптом до выкладки: коды, мета-теги, canonical, ссылки, текст в HTML.
  7. Выкладывать с копией старой версии и автоматическим откатом.
  8. Через 2–3 дня прогнать полный аудит живого сайта.
  9. В течение месяца следить за отчётами об индексации в Вебмастере и Search Console.

Ограничения

  • Сайт переехал 24 октября 2026 года. Делать выводы о позициях и трафике пока рано: поисковикам нужно несколько недель на переобход. Итоги через месяц я опубликую отдельно.
  • Это переезд личного сайта без корзины и личных кабинетов. У интернет-магазина появляются фильтры, остатки и личный кабинет, и переезд становится сложнее.
  • Статическая сборка подходит не всем: если содержимое меняется каждую минуту, нужен серверный рендеринг.

Если вы планируете переезд или редизайн и боитесь потерять позиции, посмотрите, как я веду миграцию сайтов. Проверить редиректы и canonical на своём сайте можно в отдельном инструменте.

Читать дальше

Проверка

Посмотреть, где теряется трафик

SEO-аудит страницы: 28 автоматических проверок — от индексации до микроразметки. Без регистрации, список приоритетов сразу.