У нас на сайте podbor-minuta.ru около 600 страниц-подборок квартир: по метро, району, числу комнат и цене. Они собираются заранее в готовый HTML, чтобы поисковики видели их без запуска JavaScript. У каждой свой заголовок, описание и реальный список квартир.
В Google Search Console эти страницы числились проиндексированными. За 90 дней они не получили ни одного показа. Ноль. При этом другие разделы, карточки жилых комплексов и статьи, показы получали.
Сначала я думал не туда: мало контента? маленький бюджет обхода у молодого домена? дубли? Заголовки и описания были в порядке, страницы в индексе. Тогда я посмотрел на то, что на самом деле уходит поисковику - на готовый HTML.
Я скачал страницу и убрал из неё head и скрипты, чтобы увидеть только видимый текст:
curl -s https://podbor-minuta.ru/novostroyki/metro/domodedovskaya/do-10-mln \
| sed -e 's/<script.*script>//g'
Вместо списка квартир там было одно: "Войдите через Telegram, чтобы пользоваться сервисом". Форма входа. Она попала прямо в готовый HTML. Ни заголовка страницы, ни списка, только предложение авторизоваться.
Причина в том, как устроен показ. Весь контент оборачивается в проверку доступа:
<AuthGate>{children}</AuthGate>
Когда страницы собираются заранее, пользователя нет и сессии нет. Для страниц, которые считаются не публичными, проверка показывает форму входа. И именно она сохраняется в файл. А заголовок и описание готовятся отдельно, поэтому остались правильными. Из-за этого страницы выглядели здоровыми в индексе, но поисковик читал как их содержимое форму входа.
Сама проверка - это список публичных путей:
const PUBLIC_PATH_PREFIXES = ['/project/', '/articles/', '/discounts/'];
function getRouteTier(path) {
if (PUBLIC_PATHS.includes(path)) return 'public';
if (PUBLIC_PATH_PREFIXES.some((p) => path.startsWith(p))) return 'public';
return 'authenticated';
}
Пути /novostroyki/ и /developer/ в список не добавили. Незнакомый путь считается закрытым, а значит показывается форма входа.
Починка - две строки:
const PUBLIC_PATH_PREFIXES = ['/project/', '/articles/', '/discounts/', '/novostroyki/', '/developer/'];
После пересборки все эти страницы стали отдавать реальный заголовок, вводный текст и список квартир вместо формы входа.
Что я вынес.
Готовые страницы наследуют вашу проверку доступа. Их собирают от лица гостя. Что видит незалогиненный посетитель, то и замораживается в файл, и то же читает поисковик.
Если целый раздел получает ноль показов, это почти всегда техническая причина, а не контент. Одна страница внизу выдачи - это конкуренция. Весь шаблон на нуле - смотрите готовый HTML, а не страницу в браузере, где вы залогинены и всё выглядит нормально.
Заголовок и тело страницы могут расходиться. Правильные заголовок и описание могут прятать сломанное тело.
Надёжная защита - не запись в списке, а проверка на сборке: ни одна готовая страница не должна содержать форму входа. Тогда такая ошибка не пройдёт незаметно.
600 страниц были невидимы для поиска несколько месяцев. Починка заняла две строки. Дорого обошлось то, что я верил заголовкам вместо того, чтобы посмотреть на саму страницу.
Сайт - podbor-minuta.ru, ежедневный мониторинг цен на новостройки Москвы.
Top comments (0)