📦 Сделал
— SEO-настройки на уровне Спейса. Раньше мета-теги публичных страниц жили в одном месте на весь инстанс. Теперь у каждого Спейса свой блок: title, description, OG-картинка, канонический origin. Форма собрана на общих контролах, всё уходит одним PATCH на публичный SEO-эндпоинт — не пять отдельных запросов на пять полей, а один частичный апдейт: что не тронул, то и не пришло на бэк.
— Канонический origin вынес в настройку. У маркетинговых страниц и у блога разные домены-источники, и раньше canonical склеивался из того, на чём тебя открыли. Теперь это явное поле — поисковик получает один адрес, а не два варианта одной страницы.
— SSR-lite для документов. Публичные доки отдаются с мета-тегами, вшитыми в HTML до того, как поднимется React. Полноценный SSR ради превьюшек в мессенджере — дорого; тут достаточно отрисовать
<head> на сервере и отдать остальное клиенту как обычно.— Хук блога развели с общим. Блог и публичные страницы жили на одной логике меты и мешали друг другу — теперь у блога свой путь.
— Вся секция сразу на двух языках: ~50 ключей в i18n, без хардкода строк.
🔍 Что нашли
Дубликаты canonical. Наивно — считать это багом шаблона и искать в коде, где второй раз печатается тег. Оказалось, тег печатался один раз: два
<link rel=canonical> в ответе появлялись потому, что заголовки добавлялись на двух слоях сразу — на фронте и в конфиге прокси, каждый «на всякий случай». Поисковик видит два канонических адреса и молча выбирает сам — страница может уехать не на тот URL, и в логах приложения этого не видно вообще.Лечится не хитростью, а границей: мета за приложением, прокси не трогает
<head>. Проверять при этом надо не код, а живой ответ — обойти весь sitemap и посчитать теги в сыром HTML. Тридцать секунд curl'а против часа чтения шаблонов.Спасибо что читаете. До завтра.
━━ Конец дня 263 ━━