Что нужно, чтобы твой сайт индексировался
Когда я запускал Журнал Знаний, SEO было последним, о чём я думал. Сделал SPA на hash-роутинге, всё работало, статьи открывались. Потом захотел, чтобы поисковики находили записи — и обнаружил, что они не видят вообще ничего.
Контекст
Проблема оказалась фундаментальной: hash-роутинг (#/post/...) невидим для поисковиков. Googlebot видит только одну страницу — корень сайта. Весь контент за # для него не существует. А ещё у меня не было ни robots.txt, ни sitemap.xml, ни мета-тегов.
Пришлось разбираться и всё переделывать. Вот что я выяснил, реализовав и проверив на собственном опыте.
Урок
Нормальные URL — самое важное
Если сайт — SPA, нужно перейти с hash-роутинга на History API. URL /journal/post/moi-urok вместо /#/post/moi-urok. Поисковик должен видеть каждый контент как отдельный URL.
На стороне сервера nginx должен отдавать index.html на любой запрос внутри директории:
try_files $uri $uri/ /journal/index.html;
Без этого при прямой ссылке на пост пользователь получит 404 от сервера.
robots.txt
Минимальный файл, который говорит поисковику, что можно индексировать, а что нет:
User-agent: *
Allow: /journal/
Disallow: /journal/posts/
Sitemap: https://example.com/sitemap.xml
Disallow: /journal/posts/ закрывает прямые .md файлы — чтобы не было дублей контента.
sitemap.xml
Карта сайта — список всех URL в формате XML. Генерируется автоматически при каждом обновлении контента. Я встроил генерацию в build-index.js — при каждом новом посте sitemap пересобирается. Один запрос в Search Console, и поисковик знает о всех страницах.
Мета-теги и Open Graph
<title> и <meta name="description"> — для сниппетов в поисковой выдаче. Open Graph (og:title, og:description) — для красивого отображения при шеринге в мессенджерах. У меня эти теги обновляются динамически через JS при навигации.
Регистрация в поисковых консолях
Google Search Console и Яндекс.Вебмастер — обязательно. Без регистрации поисковик может найти сайт сам (по ссылкам), но это медленно и случайно. Через консоль можно явно отправить sitemap и отслеживать индексацию.
Статичный HTML для ботов
Даже после того как я настроил нормальные URL и мета-теги, оставалась одна проблема. SPA — это по сути пустой <div id="app"></div> и пачка JavaScript-файлов. Чтобы увидеть контент, браузер должен скачать JS, распарсить и выполнить. Люди видят статью мгновенно — а вот боты не всегда.
Поисковики (Google в первую очередь) умеют рендерить JavaScript, но делают это с задержкой и не всегда корректно. А боты ChatGPT, Gemini, Perplexity и прочие AI-системы JS вообще не выполняют — они просто читают HTML как есть. Для них мой журнал выглядел как пустая страница с заголовком и всё. Никакого текста, никаких ссылок, ничего.
Я решил это радикально: при каждой публикации скрипт генерирует готовый статичный HTML-файл и кладёт его рядом со статьёй — в post/{slug}/index.html. Каждый такой файл содержит полный текст статьи, разметку, meta-теги (title, description, Open Graph) и структурированные данные в формате JSON-LD (BlogPosting с датой, автором, описанием). Это полноценная HTML-страница, которую можно открыть даже с выключенным JavaScript.
На стороне nginx я добавил простое правило: сначала проверить, есть ли статичный файл, и только если его нет — отдать SPA:
location ~ ^/journal/post/(.+)$ {
try_files /journal/post/$1/index.html /journal/index.html;
}
Получается, что бот заходит по URL /journal/post/moi-urok и мгновенно получает готовый HTML с текстом статьи. А живой пользователь тоже получает этот HTML — но SPA подхватывает управление, перехватывает навигацию и дальше всё работает как обычно: переходы между статьями без перезагрузки, анимации, все плюсы SPA.
Ещё один бонус — я добавил файл llms.txt в корень журнала. Это обычный текстовый файл с оглавлением всех публикаций: заголовки, даты, краткие описания и ссылки. AI-боты, которые обучаются искать этот файл по стандарту, могут быстро понять структуру журнала и найти нужную статью без необходимости обходить каждую страницу. Своеобразный sitemap, но для искусственного интеллекта, а не для поисковиков.
Итого: люди видят быстрый SPA, поисковики получают рендеренный HTML, AI-боты — llms.txt с картой контента. Все довольны.
Что писать и как часто
Техническая часть — это половина дела. Вторая половина — контент. Поисковики ценят:
Регулярность. Одна статья в неделю лучше, чем семь за день и месяц тишины. Поисковик видит, что сайт живой, и приходит чаще.
Длинный контент. Статьи от 1000 слов индексируются лучше коротких заметок. Не потому что поисковик считает слова, а потому что длинный текст полнее раскрывает тему — а именно это ищет пользователь.
Уникальность. Пересказ чужой статьи ранжируется плохо. Личный опыт, кейсы, собственные выводы — вот что поисковик хочет видеть. Мой Журнал Знаний именно про это — уроки из реального опыта.
Структура. Чёткие заголовки (H1 → H2 → H3), абзацы по 3-5 предложений, списки. Поисковик использует структуру для формирования сниппетов.
Естественный язык. Писать так, как говоришь. Не «оптимизация налогового вычета в 2026 году», а «как я вернул налоговый вычет за обучение». Поисковики давно понимают интент запроса, а не просто совпадение ключевых слов.
Мой график: 2-3 записи в неделю, каждая 800-2000 слов. Личный опыт, технические уроки, инсайты. Не SEO-ради-SEO, а контент, который я сам считаю ценным.
SEO для личного сайта — это не магия. Технически правильные URL, понятная карта сайта и регулярный осмысленный контент. Сделал техническую часть один раз — и дальше просто пиши.