Сайт обновили вечером.
Новый релиз успешно запустился.
Главная открывается.
Статьи работают.
Формы отправляются.
PageSpeed в норме.
Через несколько дней владелец замечает странное:
Новые страницы не появляются в Яндексе и Google.
Ещё позже начинают исчезать старые.
Разработчик проверяет:
HTTP 200 ✓
TITLE ✓
H1 ✓
canonical ✓
sitemap.xml ✓На первый взгляд SEO исправно.
Потом открывается:
https://example.ru/robots.txtа там:
User-agent: *
Disallow: /Эта конфигурация была нужна на staging.
Но вместе с очередным deployment попала в production.
С точки зрения пользователей сайт продолжал работать.
С точки зрения поисковых роботов владелец фактически сообщил:
Не обходите мой сайт.
Это один из тех SEO-дефектов, которые почти невозможно заметить глазами при обычном просмотре приложения.
И одновременно хороший пример того, почему важно понимать разницу между:
robots.txtи:
<meta name="robots">На первый взгляд оба инструмента «что-то запрещают поисковикам».
Но на самом деле они решают разные задачи.
Главное различие в одном предложении
robots.txt в первую очередь отвечает на вопрос:
Разрешено ли роботу запрашивать этот URL?
А:
<meta name="robots" content="noindex">отвечает:
Если робот получил эту страницу, разрешено ли включать её в поисковый индекс?
Именно поэтому нельзя считать эти механизмы взаимозаменяемыми.
Упрощённо:
URL
│
▼
robots.txt
│
Можно скачать?
/ \
нет да
│ │
crawler stop ▼
HTTP response
│
▼
meta robots
/ X-Robots-Tag
│
Индексировать?
/ \
нет да
│ │
noindex возможно
попадёт
в индексЭто различие кажется небольшим.
Но большая часть опасных ошибок возникает именно из-за его непонимания.
Что такое robots.txt
robots.txt — обычный текстовый файл в корне сайта:
https://example.ru/robots.txtВ нём сайт сообщает поисковым роботам, какие URL им разрешено или запрещено обходить.
Google прямо описывает robots.txt как механизм управления доступом crawler к URL, а не как способ гарантированно удалить веб-страницу из Google.
Яндекс также использует Disallow для запрета обхода страниц и разделов. При этом его документация отдельно предупреждает: URL, закрытый через robots.txt, всё равно может участвовать в поиске, поэтому для удаления страницы из результатов нужно использовать соответствующую индексную директиву или другой подход.
Простейший robots.txt
Например:
User-agent: *
Disallow:Концептуально означает:
всем роботам
можно обходить всё.А вот это уже запрет всего сайта
User-agent: *
Disallow: /Символ:
/означает корень сайта.
Следовательно:
/example
/expert
/services
/prices
/попадают под запрет обхода.
Это одна из самых опасных строк технического SEO.
Почему такой файл часто появляется случайно
Потому что на staging он вполне оправдан.
Например:
staging.example.ruне должен появляться в поиске.
Разработчик создаёт:
User-agent: *
Disallow: /В тестовой среде всё правильно.
Позже происходит:
staging config
↓
production build
↓
robots.txt
↓
Disallow: /Приложение работает идеально.
Но crawler получает совершенно другую картину.
Поэтому robots.txt — часть production-конфигурации
Его нельзя воспринимать как статический файл:
Один раз сделали — больше не трогаем.
Он должен проверяться после deployment так же, как:
/api/ready
/sitemap.xml
/robots.txtи ключевые public routes.
Что делает User-agent
Например:
User-agent: *означает:
Следующие правила предназначены для всех подходящих роботов.
Можно задавать правила и конкретному crawler.
Например логически:
User-agent: SomeBot
Disallow: /private-section/Но чем сложнее индивидуальные правила, тем выше риск, что:
Google видит одно;
Яндекс — другое;
другой crawler — третье.Поэтому без реальной необходимости конфигурацию лучше сохранять простой.
Disallow запрещает crawling
Например:
User-agent: *
Disallow: /admin/говорит crawler:
Не запрашивай URL, начинающиеся с /admin/.Это логично для технических страниц.
Например:
/admin/
/internal-search/
/logs/если они вообще публично доступны.
Но здесь появляется важное заблуждение
Разработчик думает:
Раз Googlebot не может зайти на страницу, значит она точно не появится в Google.
Не обязательно.
Google прямо предупреждает: robots.txt — не механизм гарантированного исключения веб-страницы из поиска. URL, запрещённый для crawling, всё ещё может быть известен поисковой системе из внешних и внутренних ссылок.
Яндекс сообщает аналогичную важную особенность: страницы, запрещённые в robots.txt, всё ещё могут участвовать в поиске.
Как такое возможно
Представим:
https://example.ru/private-pageзакрыта:
Disallow: /private-pageНо десять других сайтов ссылаются на неё.
Поисковая система может знать:
URL существует;
на него ссылаются;хотя содержимое ей получить нельзя.
Поэтому robots.txt — не защита конфиденциальных данных
Это принципиально.
Если страница содержит:
личные данные;
документы;
платёжную информацию;
внутреннюю CRM;
административную панель,нельзя считать:
Disallow: /admin/системой безопасности.
Правильная защита:
authentication;
authorization;
server-side access control.Для недоступных посторонним страниц сервер должен реально отказывать в доступе.
Яндекс также рекомендует для конфиденциальных страниц использовать авторизацию и соответствующие HTTP-коды, а не полагаться на поисковые директивы как на защиту информации.
Robots.txt — инструкция добросовестному crawler
Не firewall.
Не authorization.
Не ACL.
Не защита от злоумышленника.
Любой клиент может вручную открыть:
/robots.txtувидеть:
Disallow: /secret-admin/и затем попробовать запросить:
/secret-admin/Если сервер отдаёт страницу без авторизации, проблема уже не SEO.
Это security defect.
Что такое meta robots
Теперь другой механизм.
В HTML страницы можно добавить:
<meta
name="robots"
content="noindex"
>Эта директива говорит поддерживающему её поисковому роботу:
Страницу можно получить и прочитать, но включать её в результаты поиска не нужно.
Google именно так определяет noindex: после обхода страницы и обнаружения директивы документ удаляется из результатов Google Search.
Яндекс также поддерживает:
<meta name="robots" content="noindex">и указывает, что такая страница не должна включаться в поисковые результаты.
Это принципиально другая модель
robots.txt:
не приходи читать страницуа:
meta robots noindex:
приходи,
прочитай,
но не включай в индексИменно поэтому noindex должен быть доступен crawler
И вот здесь возникает одна из самых распространённых SEO-ошибок.
Разработчик хочет удалить страницу из поиска.
Он делает одновременно:
robots.txt:
Disallow: /old-pageи внутри HTML:
<meta
name="robots"
content="noindex"
>Кажется:
Запретили два раза — значит наверняка.
На самом деле эти правила могут мешать друг другу.
Почему Disallow + noindex — опасная комбинация
Чтобы поисковик увидел:
<meta name="robots" content="noindex">ему нужно получить HTML страницы.
Но robots.txt говорит:
HTML получать нельзя.
Получается:
Crawler
↓
robots.txt
↓
Disallow
↓
HTML не скачан
↓
noindex не прочитанGoogle прямо предупреждает: noindex работает только тогда, когда Googlebot может получить страницу. Если URL заблокирован через robots.txt, Google не увидит noindex, а URL при определённых обстоятельствах всё ещё способен оставаться в результатах поиска.
Яндекс тоже отдельно указывает: если страница запрещена в robots.txt, meta- или HTTP-директива страницы не применяется, поскольку робот не может её получить и прочитать.
Поэтому для удаления уже известной страницы из поиска
Обычно требуется разрешить crawler получить её:
robots.txt:
Allow crawlingи вернуть:
<meta
name="robots"
content="noindex"
>либо соответствующий:
X-Robots-Tag: noindexТогда логика последовательна:
crawler получает страницу
↓
читает noindex
↓
поисковая система
обновляет индексА если страница вообще удалена
Тогда noindex может не понадобиться.
Например документ больше не существует:
/article-oldБез замены:
404или:
410.Это уже корректно описывает состояние ресурса.
Не нужно одновременно:
404
+
noindex
+
Disallow
+
canonical на главную.Чем меньше противоречивых сигналов, тем лучше.
X-Robots-Tag — тот же уровень, но через HTTP
Вместо HTML:
<meta
name="robots"
content="noindex"
>сервер может вернуть:
HTTP/1.1 200 OK
X-Robots-Tag: noindexДля Google X-Robots-Tag позволяет использовать те же robots rules на уровне HTTP response. Особенно полезно это для ресурсов, где HTML <meta> вообще невозможно добавить, например PDF.
Яндекс также поддерживает:
X-Robots-Tag: noindexдля запрета индексирования конкретного URL.
Например PDF
Есть:
/files/internal-report.pdfHTML <head> там нет.
Но Nginx может вернуть:
X-Robots-Tag: noindexТеперь ресурс остаётся доступным по ссылке, но поисковым системам передаётся индексная политика.
Почему X-Robots-Tag особенно опасен при ошибочной конфигурации
Потому что его не видно глазами.
Страница:
/services/crmвыглядит нормально.
Исходный HTML:
noindex отсутствует.Но Nginx возвращает:
X-Robots-Tag: noindexВ браузере пользователь ничего не заметит.
Даже frontend-разработчик может ничего не увидеть.
Например ошибочная конфигурация
Концептуально:
location / {
add_header X-Robots-Tag "noindex";
}была нужна тестовой среде.
Попала в production.
Теперь:
/
/services
/expert
/portfolioвсе получают:
X-Robots-Tag: noindex.Сайт визуально полностью работает.
Но весь public URL-space попросил поисковиков не индексировать его.
Поэтому нужно проверять не только HTML
Для SEO-аудита:
View Sourceнедостаточно.
Нужны ещё реальные HTTP headers.
Например:
GET /expert/articleпроверяем:
status;
Content-Type;
X-Robots-Tag;
Location;Самая опасная ошибка №1: staging noindex попал в production
На staging:
<meta
name="robots"
content="noindex,nofollow"
>совершенно логичен.
Мы не хотим, чтобы тестовый сайт индексировался.
После deployment
Тот же общий layout используется в production.
Получаем:
<head>
<meta
name="robots"
content="noindex,nofollow"
>
</head>уже на:
https://example.ru/Пользователь ничего не замечает
Но поисковику мы сказали:
не добавлять страницы
в результаты.Это классическая массовая SEO-регрессия.
Более безопасная архитектура
Не:
if (maybeProduction) ...с неясной логикой.
А явная production-конфигурация:
ENVIRONMENT=production
PUBLIC_INDEXING=trueи preflight:
если production
и PUBLIC_INDEXING != true
→ deployment запрещён.То есть индексирование production должно быть fail-closed для релиза
Лучше вообще не развернуть сайт, чем случайно выкатить:
noindexна весь домен и обнаружить это через неделю.
Самая опасная ошибка №2: Disallow: /
Это robots-аналог той же проблемы.
Staging:
User-agent: *
Disallow: /Production должен иметь другую политику.
Но release забирает staging robots.txt.
Как обнаружить
Обычный production smoke test:
GET /robots.txtи проверка:
не содержит ли production
глобального Disallow: /если такой запрет не является осознанным.
Полезно иметь отдельный тест важных URL
Например:
/
/expert
/expert/article
/services/crm
/pricesдолжны быть разрешены правилами production robots.txt.
Самая опасная ошибка №3: закрыли целый раздел вместо одной страницы
Хотели запретить:
/admin/loginнаписали слишком широкое:
Disallow: /aили неудачное wildcard-правило.
И вместе с admin блокируются другие URL, подходящие под шаблон.
Особенно осторожно со специальными символами
Яндекс прямо предупреждает о неочевидной ошибке с символом #: поскольку в robots.txt он обозначает начало комментария, правило вида:
Disallow: /#будет интерпретироваться иначе, чем разработчик может ожидать, и способно превратиться фактически в запрет корня.
Чем хитрее шаблон — тем обязательнее автоматический тест.
Самая опасная ошибка №4: CMS поставила noindex всему разделу
Например в CMS есть настройка:
Не индексировать страницуРазработчик хотел применить её к одной тестовой публикации.
Но значение наследуется:
Экспертный центр
↓
все статьиИ получается:
35 / 50 / 100 материаловс:
<meta
name="robots"
content="noindex"
>Именно поэтому noindex должен быть частью модели страницы
Например:
SEO policy:
INDEX
NOINDEXи админ-панель должна ясно показывать состояние.
Не скрытый checkbox в глубокой настройке шаблона.
Можно даже показывать предупреждение
Например:
⚠ Страница опубликована,
но закрыта от поисковой индексации.Это намного понятнее для редактора.
Самая опасная ошибка №5: новый layout получил noindex
Допустим:
/security
/termsизначально создавались как служебные страницы.
Общий template:
noindex.Позже тот же layout начинают использовать:
/services/*Но индексная политика наследуется автоматически.
В результате коммерческие страницы оказываются закрыты.
Индексная политика должна принадлежать типу страницы
Например:
expert_article
→ indexservice_page
→ indexpublic_portfolio
→ indexinternal_search
→ noindexadmin
→ authenticationcustomer_account
→ authenticationЭто безопаснее общих CSS/layout-категорий.
Не всё, что не нужно индексировать, нужно закрывать robots.txt
Представим:
/search?q=crmМы не хотим поисковые результаты сайта в Google.
Можно подумать:
Disallow: /searchИногда это часть crawl policy.
Но если цель именно:
Страница доступна crawler, но не должна попадать в индекс,
то noindex описывает намерение намного точнее.
Robots.txt больше связан с crawl budget и пространством URL
Например сайт генерирует огромное число технических маршрутов:
/calendar/2030/...
/search?...
/logs/...Crawler вообще не обязательно должен туда постоянно ходить.
Тогда robots rules могут уменьшать ненужный crawling.
Google прямо указывает, что robots.txt используется в первую очередь для управления crawler traffic.
А meta robots — про судьбу полученного документа в поиске
Например:
/thank-youдолжна работать для пользователя.
Но отдельная поисковая посадочная страница из неё не нужна.
Можно вернуть:
200и:
<meta name="robots" content="noindex">Но не используйте noindex вместо авторизации
Например:
/account/invoicesсодержит счета клиента.
Если просто поставить:
<meta name="robots" content="noindex">страница всё равно доступна любому, кто знает URL, если сервер больше никак её не защищает.
noindex только просит поисковые системы не показывать документ.
Он не контролирует доступ человека.
Безопасность:
authentication
+
authorization.SEO:
robots/indexing directives.Это разные слои.
Что означает index, follow, noindex и nofollow
Самые известные директивы:
index
noindex
follow
nofollowindex
Фактически обычное разрешённое состояние.
Если специального ограничения нет, поисковик может индексировать страницу.
Google указывает, что all является значением по умолчанию и явное его указание обычно ничего не меняет.
Поэтому:
<meta name="robots" content="index,follow">чаще всего не требуется.
noindex
<meta
name="robots"
content="noindex"
>означает:
Не показывать эту страницу в поисковой выдаче.
nofollow
<meta
name="robots"
content="nofollow"
>означает для поддерживающего crawler:
Не переходить по ссылкам этой страницы в соответствии с данной директивой.
У Google nofollow является именно page-level правилом в robots meta/X-Robots-Tag.
none
Например:
<meta
name="robots"
content="none"
>у Google эквивалентно:
noindex, nofollow.Не добавляйте nofollow автоматически ко всему noindex
Иногда встречается шаблон:
если noindex
→ всегда nofollow.Но это не одно и то же решение.
Страница может быть не нужна в индексе, но содержать полезные ссылки на:
товары;
статьи;
категории.Поэтому индексную политику и link-follow policy лучше определять осознанно.
Что если в HTML несколько robots meta
Например:
<meta
name="robots"
content="index,follow"
>
<meta
name="robots"
content="noindex"
>Не стоит рассчитывать:
Последний победит.
Для Google при конфликтующих robots rules применяется более ограничительная комбинация. Например сочетание общего и специфического правила может в итоге сформировать noindex, nofollow.
Это важно для компонентных приложений
Например:
BaseLayoutдобавляет:
index,followа:
ArticlePageслучайно добавляет:
noindex.В DOM находятся оба.
Сайт визуально работает.
Но поисковый робот получает запрещающий сигнал.
Поэтому meta robots должна формироваться в одном месте
Например SEO layer принимает:
page.indexabilityи создаёт один итоговый robots contract.
Не несколько компонентов, каждый из которых независимо добавляет <meta>.
То же касается X-Robots-Tag + meta robots
HTML:
<meta
name="robots"
content="index,follow"
>HTTP:
X-Robots-Tag: noindexТеперь присутствуют противоречивые правила.
Ограничительный сигнал может победить.
Следовательно:
HTMLи:
HTTP headersнужно проверять вместе.
Что использовать для PDF
У PDF нет:
<head>поэтому:
meta robotsне подходит.
Но:
X-Robots-Tag: noindexподходит отлично.
Google прямо приводит не-HTML файлы — PDF, видео и изображения — как типичный сценарий X-Robots-Tag.
Например
HTTP/1.1 200 OK
Content-Type: application/pdf
X-Robots-Tag: noindexФайл можно скачать.
Но поисковику сообщено:
Не показывать этот ресурс как отдельный результат.
Robots.txt и JavaScript/CSS
Есть ещё одна менее очевидная проблема.
Раньше некоторые сайты массово запрещали crawler:
Disallow: /js/
Disallow: /css/из идеи:
Зачем поисковой системе наши технические файлы?
Но современным crawler может понадобиться JavaScript и CSS, чтобы корректно отрендерить страницу.
Если SEO зависит от JavaScript
например:
HTML shell
↓
JavaScript
↓
Article renderingа важный JS-файл закрыт для crawler, поисковая система может получить неполный документ.
Поэтому не нужно блокировать ресурсы только потому, что:
Пользователь их напрямую не ищет.
Нужно понимать, участвуют ли они в rendering.
Для SSR/SSG риск меньше
Если сервер сразу отдаёт:
<h1>...</h1>
<p>...</p>основное содержимое доступно без выполнения клиентского JavaScript.
Но CSS/JS всё равно может быть важен для понимания итогового представления страницы.
Robots.txt не должен конфликтовать с Sitemap
Представим:
sitemap.xmlсодержит:
/expert/articleа robots.txt:
Disallow: /expert/Сайт одновременно говорит:
Вот мои важные страницы.
и:
Не заходите на них.
Такие противоречия нужно ловить автоматически
Например CI получает все URL из sitemap и проверяет:
robots policy:
ALLOWEDдля каждой indexable страницы.
Если:
/expert/a
→ blockedrelease падает.
Это очень сильный технический SEO-тест
Потому что один:
Disallow: /expert/может одновременно сломать:
10;
50;
500;
5000страниц.
Robots.txt и canonical
Представим duplicate page:
/article?ref=xсодержит:
canonical → /articleНо /article?ref=x закрыт:
DisallowCrawler может не получить HTML и, соответственно, не увидеть canonical.
Это ещё один пример, почему нельзя смешивать механизмы без понимания уровня, на котором они работают.
Если хотите, чтобы crawler обработал canonical
ему нужно получить документ.
То же правило, что и с noindex.
Поэтому crawl control и index control нужно проектировать вместе
Например URL-класс:
tracking_variantможет иметь:
crawl: allow
index: canonical-to-baseДругой:
internal_searchможет иметь:
crawl: allow
index: noindexили другую осознанную политику.
А:
private_accountвообще:
authentication required.Не robots.
Можно формализовать SEO-policy
Например:
PAGE TYPE CRAWL INDEX
Expert article ALLOW INDEX
Service page ALLOW INDEX
Portfolio case ALLOW INDEX
Search results ALLOW NOINDEX
Tracking variant ALLOW CANONICAL
Admin AUTH —
Client account AUTH —
Deleted page 404/410 —Это значительно понятнее набора случайных directives.
Тогда robots.txt строится из архитектуры
Не наоборот.
Сначала определяем:
Какие URL-классы вообще существуют?
Потом:
Какие должны crawled?
Потом:
Какие indexable?
И только после этого создаём технические правила.
Частая ошибка: закрывать фильтры одной строкой
Например:
Disallow: /*?чтобы не обходить query parameters.
Но среди URL с параметрами могут существовать разные классы:
?utm_source=
→ tracking?sort=
→ представление?brand=
→ возможно самостоятельная landing page?page=
→ пагинацияОдна маска может закрыть полезные страницы.
Особенно осторожно с динамическим каталогом
Правило:
всё с ? запрещаемможет неожиданно убрать доступ crawler к страницам, которые бизнес хотел продвигать.
Сначала классификация URL.
Потом robots policy.
Не наоборот.
Яндекс имеет отдельный Clean-param
Для параметров, которые не меняют содержимое документа, Яндекс поддерживает Clean-param в robots.txt. Он предназначен именно для сигнализации о незначимых GET-параметрах, например tracking-параметрах.
Но это специфическая возможность Яндекса.
Не нужно считать её универсальным стандартом для всех поисковых систем.
Для общей архитектуры URL всё равно полезны:
canonical;
чистые внутренние ссылки;
последовательная parameter policy.Почему robots.txt не должен использоваться для секретных URL
Допустим существует:
/internal-backup/и robots.txt содержит:
Disallow: /internal-backup/Теперь адрес фактически опубликован всем, кто открыл robots.txt.
То есть:
robots.txtможет даже помочь обнаружить чувствительный маршрут.
Настоящее решение:
не публиковать;
аутентифицировать;
закрыть на сетевом уровне.Как действительно скрыть страницу от посторонних
Например клиентский документ.
Правильная схема:
GET /account/document/123
↓
authentication
↓
authorization
↓
200 / 403А не:
robots.txt
→ Disallow.SEO-директивы никогда не должны быть единственной линией security.
Что произойдёт, если robots.txt вообще отсутствует
Не нужно считать:
Без robots.txt поисковики не смогут индексировать сайт.
Обычно отсутствие запретительных правил означает, что crawler не получает от этого файла специальных ограничений.
Яндекс прямо отмечает: если robots.txt не соответствует требованиям или отсутствует в применимом смысле, сайт считается открытым для индексирования/обхода.
То есть robots.txt не обязательно должен быть огромным
Для небольшого нормального публичного сайта он может быть очень простым.
Например концептуально:
User-agent: *
Disallow:
Sitemap: https://example.ru/sitemap.xmlИ всё.
Не нужно придумывать сто правил только ради того, чтобы файл выглядел «профессионально».
Чем сложнее robots.txt, тем выше цена ошибки
Например:
15 User-agent blocks;
40 wildcard rules;
Allow;
Disallow;
несколько Sitemap;
parameter rules.Через год уже никто не понимает:
Почему /expert/article запрещён Googlebot, но разрешён Яндексу?Инфраструктурные правила должны быть настолько простыми, насколько позволяет продукт.
Как случайно закрыть только Google или только Яндекс
Например:
User-agent: Googlebot
Disallow: /При этом:
User-agent: Yandex
Allow: /В результате владелец смотрит:
Яндекс индексирует ✓и думает:
С robots всё нормально.
А Google целиком закрыт.
Или наоборот
Это одна из причин проверять индексируемость отдельно для целевых crawler, а не только визуально читать robots.txt.
Google Search Console и Яндекс Вебмастер
Для диагностики полезно использовать инструменты обеих систем.
В Google проверяем:
может ли Googlebot получить URL;
есть ли noindex;
какой HTML увидел crawler.Google сам рекомендует при проблемах с присутствием страницы в поиске проверять доступ Googlebot и случайную блокировку в robots.txt, а также искать noindex в HTML.
В Яндекс Вебмастере
можно использовать анализ robots.txt и проверку конкретного URL, чтобы понять:
разрешён ли обход;
есть ли запрещающая директива;
какой статус страницы видит робот.Но внешние инструменты не заменяют собственные тесты
Search Console обнаружит проблему после того, как Google уже столкнулся с ней.
Гораздо лучше:
CI
↓
deployment
↓
SEO smoke tests
↓
production acceptedи только потом:
Googlebot/YandexBot.Поисковый робот не должен быть первым автоматическим тестом SEO-конфигурации.
Что тестировать перед релизом
Минимальный набор:
GET /robots.txt
→ 200проверяем содержание.
Для главной:
/ожидаем:
crawl allowed;
no noindex.Для статьи:
/expert/articleожидаем:
crawl allowed;
index allowed;Для services:
/services/crmто же самое.
Для technical/private:
проверяем уже соответствующую продуктовую политику.
Проверяем HTML
У indexable страницы не должно неожиданно появиться:
<meta
name="robots"
content="noindex"
>Проверяем headers
Не должно быть:
X-Robots-Tag: noindexна публичной индексируемой странице.
Проверяем случайное глобальное правило
Например тест должен явно упасть при production:
User-agent: *
Disallow: /если продукт не находится на запланированной технической паузе.
Можно сделать SEO invariant
Например:
PRODUCTION_PUBLIC_PAGE:
- status = 200
- robots.txt allows URL
- noindex absent
- X-Robots-Tag noindex absent
- canonical valid
- sitemap contains canonicalЭто уже не рекомендация.
Это формальный contract.
Очень полезный тест Sitemap vs robots
Берём все:
<loc>из sitemap.
Для каждого спрашиваем:
разрешён ли URL robots policy?Если Sitemap говорит:
индексируйа robots:
не обходи,CI предупреждает о конфликте.
И обратная проверка
Для всех опубликованных SEO-страниц:
indexable = trueпроверяем:
не получили ли они noindex.Так CMS не сможет случайно опубликовать материал:
Published
+
Noindexбез явного предупреждения.
Как безопасно работать со staging
Лучший вариант — не надеяться только на поисковые директивы.
Например:
staging.example.ruдоступен только:
VPN;
Basic Auth;
internal network.Теперь поисковый робот физически не сможет получить контент.
Это сильнее, чем просто:
noindex.Почему
Потому что staging может содержать:
неопубликованные материалы;
тестовые аккаунты;
черновики;
экспериментальные функции.SEO-директива не является security boundary.
Но если staging всё же публичен
можно добавить дополнительную страховку:
robots.txt:
Disallow: /и/или соответствующую index policy.
Главное — гарантированно не переносить staging-настройку на production.
Можно сделать environment-aware test
Например:
IF ENV=production
THEN
robots must allow public routes
public routes must not noindexи:
IF ENV=staging
THEN
public indexing must be disabledТак правила перестают зависеть от человеческой памяти.
Почему просто проверять наличие meta robots недостаточно
Представим HTML:
<meta
name="robots"
content="index,follow"
>Разработчик доволен.
Но:
robots.txt:
Disallow: /Crawler до HTML вообще не доходит.
robots.txt:
Allowно HTML:
noindex.Crawler проходит.
Документ всё равно не должен попадать в результаты.
Поэтому нужно проверять весь pipeline
URL
↓
robots.txt
↓
HTTP status
↓
X-Robots-Tag
↓
HTML meta robots
↓
canonical
↓
content
↓
indexingКаждый слой отвечает за своё.
Где находится canonical
Canonical не разрешает индексирование и не запрещает crawling.
Он отвечает на другой вопрос:
Какой URL считать основным среди одинаковых или очень похожих документов?
То есть:
robots.txt
→ crawl
meta robots
→ indexability
canonical
→ canonicalization.Это три независимых понятия.
Пример правильной обычной статьи
URL:
/expert/api-versioning
robots:
ALLOW
HTTP:
200
X-Robots-Tag:
нет запрещающих правил
meta robots:
indexable/default
canonical:
/expert/api-versioning
sitemap:
yesСигналы согласованы.
Пример удалённой статьи
URL:
/expert/old
HTTP:
410
sitemap:
no
internal links:
noНе нужно добавлять ещё:
Disallow
+
noindex
+
canonical /Ресурс уже честно сообщил своё состояние.
Пример внутреннего поиска
/search?q=crmЕсли страница нужна пользователю, но не поисковому индексу:
HTTP 200
meta robots noindexможет быть понятной политикой.
Пример аккаунта пользователя
/accountГлавная политика:
authentication
+
authorization.А SEO становится вторичной задачей.
Пример tracking URL
/article?utm_source=telegramНе обязательно закрывать его в robots.txt.
Можно позволить crawler увидеть:
canonical → /article.Почему этот принцип важен
Если заблокировать tracking-вариант до получения HTML:
Disallowcrawler не сможет прочитать canonical на основной URL.
Иногда запрет обхода технически оправдан.
Но он должен быть выбран сознательно, а не потому, что:
Параметры выглядят некрасиво.
Нужно ли использовать robots.txt для экономии crawl budget
На огромных сайтах — иногда да.
Если существуют:
сотни тысяч;
миллионыбесполезных комбинаций URL, crawl management становится серьёзной задачей.
Google действительно позиционирует robots.txt прежде всего как инструмент управления crawler traffic.
Но для сайта с несколькими десятками или сотнями полезных страниц
не нужно превращать crawl budget в мистическую оптимизацию.
Гораздо важнее:
правильные URL;
внутренние ссылки;
sitemap;
HTTP;
canonical;
отсутствие случайного noindex.robots.txt не улучшает ранжирование сам по себе
Нельзя написать:
Disallow: /bad-pages/и получить:
+10 позиций.Его задача техническая:
управление crawling.Так же:
noindexне является способом повысить позиции нужной страницы автоматически.
Это управление составом поискового индекса.
Нужно быть осторожным с массовым noindex
Представим SEO-аудит показывает:
500 слабых страниц.Команда одним release ставит:
noindexна весь тип страниц.
Но среди них оказывается:
20 страницс реальным organic traffic.
SEO-cleanup превращается в потерю поиска.
Поэтому перед массовым noindex нужна классификация
Например:
traffic;
impressions;
backlinks;
business value;
content uniqueness.И только потом решение.
Не:
этот template кажется неважным
→ noindex всё.То же относится к robots Disallow
Маска может затронуть намного больше страниц, чем предполагает человек.
Поэтому любые wildcard/широкие правила должны проходить:
positive tests;
negative tests.Должно быть заблокировано:
/internal-search/Должно оставаться разрешено:
/expert/search-engine-indexingЕсли правило случайно блокирует оба — CI падает.
Роботы разных поисковых систем могут интерпретировать детали по-разному
Яндекс прямо напоминает, что роботы других поисковых систем и сервисов могут по-разному обрабатывать отдельные robots directives.
Поэтому лучше строить критичную индексную политику на хорошо поддерживаемых стандартных механизмах:
HTTP;
robots.txt crawling rules;
meta robots;
X-Robots-Tag;
canonical.А search-engine-specific возможности использовать только там, где они действительно нужны.
Самый безопасный public robots.txt часто самый скучный
Это нормально.
SEO-инфраструктура не должна впечатлять количеством правил.
Она должна быть предсказуемой.
Например:
User-agent: *
Disallow:
Sitemap: https://example.ru/sitemap.xmlплюс только действительно необходимые ограничения.
Когда robots.txt становится длинным
это хороший повод спросить:
Почему у нашего публичного сайта вообще существует столько crawler-доступных технических URL?
Возможно проблема не в robots.txt.
А в routing architecture.
Лучший способ бороться с нежелательными URL — не создавать их без необходимости
Например вместо:
100 вариантов параметровможно:
нормализовать routing;
не создавать ссылки;
использовать canonical;
ограничить генерацию.Robots — последняя часть системы.
Не первая.
Как выглядит хороший SEO lifecycle страницы
Публичная статья
Published
↓
HTTP 200
↓
crawl allowed
↓
index allowed
↓
self-canonical
↓
sitemapЧерновик
Не должен становиться обычной публичной SEO-страницей вообще.
Лучше:
authorization / preview tokenчем:
public URL + надежда на noindex.Удалённая
404/410
↓
нет в sitemap
↓
нет внутренних ссылок.Внутренняя
auth
↓
crawler не получает private content.Это намного понятнее смешанной схемы
Disallow
+
noindex
+
nofollow
+
canonical /
+
302на одном URL.
Когда требуется пять механизмов одновременно, почти наверняка стоит заново сформулировать:
Что именно мы хотим сказать поисковику?
Практическая таблица
| Задача | Основной механизм |
|---|---|
| Не давать crawler обходить технический раздел | robots.txt |
| Не показывать доступную HTML-страницу в поиске | meta robots: noindex |
| Не индексировать PDF/не-HTML ресурс | X-Robots-Tag: noindex |
| Защитить личные данные | Authentication / Authorization |
| Сообщить, что страница удалена | 404/410 |
| Перенести URL | 301/308 |
| Объединить технические дубли | Canonical |
| Закрыть staging от посторонних | Auth/network restriction, SEO rules как дополнительная страховка |
Практический production checklist
Перед каждым значимым релизом SEO-системы стоит проверить:
/robots.txtсуществует и возвращает ожидаемый ответ;- production robots.txt не содержит случайный
Disallow: /; - главная доступна crawler;
/expert,/services,/portfolio,/pricesи другие SEO-разделы не заблокированы;- Sitemap URLs разрешены robots policy;
- публичные indexable страницы не содержат
meta robots noindex; - публичные indexable страницы не получают
X-Robots-Tag: noindex; - нет противоречивых robots meta tags;
- staging не индексируется;
- production и staging используют разные проверяемые policies;
- private pages защищены авторизацией, а не только robots.txt;
- removed pages используют правильный HTTP lifecycle;
- canonical-страницы доступны crawler;
- важные JS/CSS assets не закрыты без причины;
- правила для параметров не блокируют полезные landing pages;
- широкие
Disallowпроходят тесты на конкретных URL; - Search Console и Яндекс Вебмастер не показывают неожиданные crawl/index blocks.
Очень полезный автоматический тест
Создаём список обязательных indexable routes:
/
/services
/prices
/portfolio
/expert
/expert/test-articleПосле deployment проверяем каждый:
HTTP = 200
robots.txt = allowed
meta noindex = false
X-Robots-Tag noindex = falseЕсли хотя бы одно условие нарушено:
release failed.Отдельный тест staging
environment = stagingожидает противоположную политику:
public indexing disabled.Так одна и та же система тестов одновременно гарантирует:
production открыти:
staging закрыт.Это намного надёжнее человеческого правила
Перед релизом не забудь поменять robots.txt.
Человек однажды забудет.
CI — не должен.
Почему это особенно важно для динамической редакционной системы
Когда статей:
10их ещё можно проверить вручную.
Когда:
100;
500;
5000,невозможно открывать каждую и искать:
noindex.Индексная политика должна автоматически следовать состоянию контента.
DRAFT
→ private preview
SCHEDULED
→ private/not public
PUBLISHED
→ indexable
ARCHIVED
→ определяется бизнес-политикой
DELETED
→ 404/410Тогда редактор не занимается техническими тегами.
Он управляет жизненным циклом материала.
А SEO-система сама формирует правильный HTTP/robots contract.
Это лучший вариант
Редактор принимает бизнес-решение:
Опубликовать.
Система автоматически выполняет:
route
TITLE
description
canonical
robots policy
structured data
sitemap
internal listingИ тестирует результат.
Тогда noindex становится осознанным исключением
Например:
спецстраница для рекламной кампании,
которую нельзя показывать в organic search.Администратор явно выбирает:
Search indexing:
OFFи получает предупреждение.
Не должно существовать скрытого noindex
Самая плохая ситуация:
Почему страница не индексируется?
А ответ:
Потому что два года назад в layout случайно поставили meta tag.
SEO-policy должна быть наблюдаемой.
Что можно показывать в админ-панели
Например возле статьи:
Search:
INDEXABLE ✓
Canonical:
https://...
Sitemap:
INCLUDED ✓
Robots:
ALLOWED ✓или:
Search:
NOINDEX ⚠Теперь даже контент-менеджер видит техническое состояние страницы.
А ещё можно добавить глобальную SEO-диагностику
Например:
Indexable pages: 184
Noindex pages: 12
Blocked by robots: 4
Canonical conflicts: 0
Sitemap conflicts: 0Тогда ошибка Disallow: / становится видна сразу, а не после падения поискового трафика.
Что делать, если сайт уже случайно закрыли
Представим production несколько дней содержал:
User-agent: *
Disallow: /или:
X-Robots-Tag: noindex.Первое действие — не паниковать и не начинать хаотично менять всё SEO.
Сначала исправляем реальную причину
Например robots.txt:
public routes разрешены.Или удаляем:
noindexиз production response.
Затем проверяем реальный HTTP
Не repository.
Не локальную версию.
А:
production domain.Проверяем:
/robots.txt
/
/expert
несколько статей.После этого — поисковые инструменты
В Google:
URL Inspection.В Яндексе:
Проверка страницы;
robots.txt analysis;
переобход при необходимости.Google рекомендует URL Inspection именно для проверки того, какой HTML и какие index directives реально получил Googlebot.
Яндекс предоставляет аналогичные инструменты проверки страницы и анализа robots.txt.
Но возврат не обязан быть мгновенным
Поисковой системе нужно:
повторно получить robots.txt;
повторно обойти URL;
увидеть изменившиеся directives;
пересчитать состояние документа.Это асинхронный процесс.
Поэтому правильная задача после исправления:
подтвердить,
что технический запрет снят.А не:
Через пять минут страница обязана вернуться на старую позицию.
Самый важный принцип
Не нужно думать:
robots.txt = запрет индексациии:
meta robots = ещё один способ
сделать то же самое.Правильнее:
robots.txt
=
управление crawlingmeta robots / X-Robots-Tag
=
управление индексированием
и представлением документаИз этого следует почти всё остальное
Если поисковику нужно увидеть:
noindex;
canonical;
контент;нужно позволить ему получить страницу.
Если URL содержит конфиденциальные данные:
robots.txt и noindexвообще не являются основной защитой.
Если страница удалена:
HTTP 404/410лучше описывает состояние.
Если URL переехал:
301.Если есть технический дубль:
canonical.Каждый инструмент имеет свою область ответственности.
Вместо вывода
robots.txt и meta robots часто находятся в одном разделе SEO-инструкций, поэтому легко решить, что они делают почти одно и то же.
На практике разница фундаментальная.
robots.txt стоит до страницы:
Crawler
↓
robots.txt
↓
можно ли вообще запросить URL?А meta robots находится внутри уже полученной страницы:
HTTP
↓
HTML
↓
<meta name="robots">
↓
что делать с документом
в поисковом индексе?X-Robots-Tag решает похожую индексную задачу на уровне HTTP response и особенно полезен для не-HTML ресурсов.
Именно поэтому один из самых опасных SEO-антипаттернов выглядит так:
robots.txt:
Disallow: /page
page:
noindexРазработчик думает:
Дважды запретили индексирование.
А crawler отвечает:
Вы не позволили мне получить страницу, поэтому второй запрет я вообще не увидел.
Ещё опаснее массовые ошибки:
Disallow: /или:
X-Robots-Tag: noindexна production.
Сайт продолжает работать для пользователей, поэтому дефект может долго оставаться незаметным.
Поэтому правильная SEO-архитектура должна исходить не из тегов, а из состояния каждого класса страниц:
Можно ли crawler её получать?
Нужно ли её индексировать?
Она публичная или приватная?
Она существует или удалена?
Это самостоятельная страница или дубль?После этого механизм выбирается естественно:
crawl control
→ robots.txt
index control
→ meta robots / X-Robots-Tag
security
→ authentication / authorization
deleted
→ 404 / 410
moved
→ 301
duplicate
→ canonicalА главное правило production звучит ещё проще:
поисковая индексация не должна зависеть от того, вспомнил ли разработчик перед релизом удалить Disallow: / или noindex.
Эти условия должны проверяться автоматически.
Тогда поисковые роботы перестают быть первыми, кто обнаруживает ошибку конфигурации сайта.