Обсудить проект

Стейджинг и прод: как не выкатить Disallow: / на рабочий сайт

Тестовый сайт закрывают через robots.txt, и Disallow: / уезжает в прод. Разбираю, как закрыть стейджинг паролем и что проверить в первые пять минут после релиза.

Vladislav Krivorutsko14 сентября 2026 г.8 мин чтения
Содержание

TL;DR — коротко о главном

  • Стейджинг закрывается от индексации паролем на уровне сервера (basic-auth), а не строкой Disallow: / в robots.txt: пароль не попадает в репозиторий и не уезжает в прод вместе с кодом
  • Disallow: / не удаляет адреса из индекса: Google может показать закрытый URL без описания, если на него есть ссылки
  • Запрет индексации прячется в пяти местах: файл robots.txt, мета-тег robots, заголовок X-Robots-Tag, настройка WordPress в базе данных и правила CDN
  • После каждого релиза проверка занимает пять минут: открыть /robots.txt, поискать noindex в коде главной, посмотреть заголовки ответа через curl -I

Короткий ответ

Стейджинг закрывают паролем в конфиге веб-сервера (basic-auth в nginx или Apache), а не строкой Disallow: / в robots.txt. Пароль живёт на тестовом сервере и в репозиторий не попадает, поэтому деплой не может перенести его на рабочий сайт. robots.txt и мета-тег noindex лежат в коде проекта и уезжают в прод вместе со всем остальным.

После каждого релиза нужны три проверки на рабочем домене: содержимое файла robots.txt, поиск noindex в коде главной страницы и заголовки ответа сервера через curl. На всё уходит 5 минут.

Почему Disallow: / не защищает тестовый сайт

У Disallow: / на стейджинге два дефекта. Первый: он не закрывает от индексации. Google Search Central прямо пишет, что robots.txt управляет сканированием, а заблокированный URL может попасть в индекс, если на него есть ссылки. Тестовый поддомен находят по ссылке в письме, в таск-трекере с публичной доской, в скриншоте, в Referer. Потом в выдаче появляется dev.сайт.ee с пометкой, что описание недоступно.

Второй дефект дороже. Файл лежит в репозитории, и при релизе его копируют на прод. Сайт при этом работает, открывается, форма отправляется, в браузере никто ничего не заметит. Узнают через одну-две недели по графику показов в Search Console. В статье про миграцию сайта без потери трафика я называл это самой частой причиной провала переезда, и за годы аудитов это не изменилось.

Способ закрыть стейджингЗащищает от индексацииМожет уехать в прод при деплоеКак проверить
Disallow: / в robots.txtНет, закрывает только сканированиеДа, файл в репозиторииОткрыть /robots.txt
Мета-тег noindex в шаблонеДаДа, если не завязан на переменную окруженияПоиск noindex в исходном коде
Заголовок X-Robots-Tag: noindexДаДа, если конфиг сервера копируют целикомcurl -I https://сайт.ee/
Basic-auth на веб-сервереДа, робот получает 401Нет, конфиг тестового сервера отдельныйОткрыть сайт в режиме инкогнито
Доступ по списку IPДа, робот получает 403НетОткрыть сайт с мобильного интернета

Как закрыть стейджинг, чтобы запрет не переехал

Рабочая схема у меня одна: basic-auth на уровне nginx только в конфиге тестового окружения. В проекте на Next.js или WordPress при этом нет ни одной строки про индексацию, которая отличалась бы между стейджингом и продом.

server {
    server_name dev.example.ee;
    auth_basic "Staging";
    auth_basic_user_file /etc/nginx/.htpasswd-staging;
    # ...
}

Если сайт живёт на Cloudflare, ту же задачу решает Cloudflare Access на поддомен стейджинга: доступ по почте или по одноразовому коду, и снова вне репозитория. На Vercel превью-сборки по умолчанию отдают X-Robots-Tag: noindex, но на свой домен продакшена этот заголовок не ставится, так что там риск другого рода: закрытым оказывается превью, которое вы отправили клиенту как «почти готовый сайт».

Когда без мета-тега в коде не обойтись (например, один шаблон Next.js собирается на все окружения), noindex включается только при явной переменной вроде SITE_ENV=staging. Отсутствие переменной должно означать «индексировать», а не наоборот. Если логика обратная, первый же сервер, где переменную забыли задать, окажется закрытым.

Где запрет прячется при релизе

Когда трафик просел после релиза, я проверяю 5 мест в таком порядке: от самого частого к самому незаметному, от robots.txt до правил Cloudflare.

СтейджингПрод после деплояrobots.txt: Disallow: /meta robots noindex в шаблонеX-Robots-Tag в конфигеWordPress: blog_public = 0basic-auth в nginx стейджингакод, конфиг,копия базывсе четыре запретапереехали вместе с кодоми базойпароля на проде нетКрасное лежит в проекте или в базе и переносится. Зелёное остаётся на сервере стейджинга.
  1. Файл robots.txt. Открываю https://сайт.ee/robots.txt в браузере. Ищу Disallow: / без пути после слеша. Если файл генерируется (в Next.js это app/robots.ts), смотрю ещё и код генератора: там бывает условие по окружению с перепутанной веткой.
  2. Мета-тег robots. Поиск noindex в исходном коде главной и одной внутренней страницы, не в DevTools, а через «Просмотр кода страницы». Разные шаблоны могут вести себя по-разному.
  3. Заголовок X-Robots-Tag. Команда curl -I https://сайт.ee/ показывает заголовки ответа. Этот запрет не виден ни в коде страницы, ни в браузере, и поэтому его ищут последним, хотя проверяется он за секунду.
  4. Настройка WordPress. Галочка «Попросить поисковые системы не индексировать сайт» хранится в базе данных в опции blog_public. При переносе базы со стейджинга на прод она переезжает, даже если файлы проекта заливали чистыми. С версии 5.7 WordPress выводит в этом случае мета-тег noindex, так что проверка из пункта 2 её тоже поймает.
  5. Правила CDN и хостинга. Transform Rules в Cloudflare, заголовки в панели хостинга, плагины безопасности. Если curl -I показывает X-Robots-Tag, а в конфиге nginx его нет, искать нужно здесь.

Отдельный случай, про который забывают: robots.txt открыт, но в нём закрыт путь к CSS и JS. Сайт в индексе, но Google рендерит его без стилей. Правила того, что закрывать в этом файле, а что нет, я разбирал в статье про sitemap.xml и robots.txt.

Проверка после релиза: пять минут

Эти 5 пунктов я прогоняю руками после любого релиза, который трогал шаблоны, конфиг nginx или базу данных.

  1. https://сайт.ee/robots.txt в браузере: нет Disallow: /, есть строка Sitemap: с рабочим адресом.
  2. Исходный код главной и одной карточки или статьи: нет noindex, canonical указывает на рабочий домен, а не на dev..
  3. curl -I https://сайт.ee/: статус 200, нет X-Robots-Tag: noindex.
  4. «Проверка URL» в Search Console для главной с кнопкой «Проверить страницу на сайте»: статус «URL можно проиндексировать».
  5. Через два-три дня отчёт «Индексирование страниц»: не растёт категория «Заблокировано в файле robots.txt» или «Исключено тегом noindex».

Пункт про canonical появился в списке не для полноты. Шаблон Next.js или WordPress, собранный на стейджинге, иногда берёт домен из переменной окружения, и прод получает canonical на тестовый адрес. Google тогда видит две версии одного текста и выбирает каноническую сам; как это выглядит в отчётах, описано в разборе про дубли страниц.

Если запрет уже уехал в прод

Порядок действий зависит от того, какой запрет сработал: robots.txt или noindex. Поэтому сначала диагностика по 5 пунктам выше, потом правка в Search Console.

  • Уехал Disallow: /. Исправьте файл, затем в Search Console откройте отчёт о файле robots.txt и запросите повторное сканирование. Google кэширует robots.txt до 24 часов, без запроса робот может ещё сутки работать по старой версии.
  • Уехал noindex. Уберите его и отправьте на проверку URL главную и основные разделы. Остальное подтянется при обычном обходе.
  • В обоих случаях переотправьте sitemap.xml: это даёт роботу список адресов, которые нужно обойти заново.

Срок возврата предсказать нельзя, он зависит от частоты обхода конкретного сайта. На сайте, который Googlebot посещает ежедневно, первые страницы возвращаются быстрее, чем на сайте на 30 страниц, куда робот заходит раз в неделю. Если через две-три недели страницы по-прежнему висят в статусе «Просканирована, но пока не проиндексирована», причина уже не в запрете, и дальше помогает разбор из статьи о том, почему страницы не индексируются в Google.

Кому basic-auth не подходит

Пароль на стейджинге неудобен в 3 ситуациях, и в них я выбираю Cloudflare Access, список IP или отдельный тестовый URL.

  • Клиент или контент-менеджер смотрит тестовый сайт с телефона и путается в окне авторизации. Здесь лучше Cloudflare Access с входом по почте.
  • Внешний сервис должен ходить на стейджинг без пароля: платёжный шлюз шлёт вебхуки, мониторинг проверяет доступность. Тогда доступ по списку IP с исключением для адресов сервиса, а не снятие защиты.
  • Нужно проверить, как Google рендерит страницу до релиза. Инструмент «Проверка URL» на закрытый паролем сайт не зайдёт. Такую проверку делают на отдельном открытом URL с noindex, который удаляют сразу после теста, и это единственное место, где мета-тег на тестовом окружении оправдан.

Частые вопросы

Как закрыть тестовый сайт от индексации Google?
Надёжнее всего паролем на уровне веб-сервера: basic-auth в nginx или Apache либо доступ по списку IP-адресов. Googlebot не проходит авторизацию, поэтому не видит ни одной страницы и не может ничего проиндексировать. Robots.txt для этого не подходит: он запрещает сканирование, а не индексацию, и сам файл легко переезжает на рабочий сайт вместе с кодом.
Тестовый поддомен попал в индекс Google. Что делать?
Сначала закройте поддомен паролем, чтобы новые адреса перестали попадать в выдачу. Затем подтвердите поддомен в Search Console и отправьте запрос в инструменте «Удаления»: он скрывает адреса из результатов примерно на шесть месяцев. За это время Google переобойдёт закрытые паролем страницы, получит ответ 401 и уберёт их из индекса окончательно.
Сколько времени сайт возвращается в выдачу после снятия Disallow: /?
Точного срока нет, он зависит от того, как часто Googlebot обходит сайт. Google кэширует robots.txt до 24 часов, поэтому сначала робот должен перечитать сам файл, затем заново обойти страницы. Ускорить процесс можно запросом повторного сканирования robots.txt в Search Console, отправкой sitemap.xml и проверкой URL для самых важных страниц.
Почему в Search Console статус «Проиндексировано, несмотря на блокировку в файле robots.txt»?
Потому что robots.txt запрещает Google скачивать страницу, но не запрещает индексировать её адрес. Если на URL ведут ссылки, Google может добавить его в индекс и показывать без описания. Чтобы страница ушла из выдачи, её нужно открыть для сканирования и отдать noindex, либо закрыть паролем, либо удалить с ответом 404 или 410.
Нужен ли noindex на стейджинге, если там уже стоит пароль?
Не нужен, и я его туда специально не ставлю. Пароль и так отсекает робота, а мета-тег noindex в шаблоне — это ровно та вещь, которая при релизе переезжает на прод. Если без мета-тега не обойтись, он должен включаться переменной окружения, которой на рабочем сервере просто нет.

Выводы

Защита стейджинга должна жить там, куда деплой не дотягивается: в конфиге веб-сервера тестового окружения, а не в файлах проекта. Тогда перенос кода на прод физически не может унести запрет с собой, и проверка после релиза превращается в формальность на пять минут. Если сайт уже выкатили с закрытой индексацией и показы в Search Console упали, это чинится быстро, но только после того, как найдено, откуда именно берётся запрет. Такие разборы я делаю в рамках [SEO-продвижения](/seo), а схему окружений с паролем на стейджинге закладываю сразу, когда собираю сайт в рамках [веб-разработки](/web-razrabotka).

Автор статьи

Владислав Криворучко — основатель ADLAB
Владислав Криворучко

Основатель ADLAB OÜ · SEO и Google Ads

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

  • 20+ лет в поисковом трафике
  • 50+ проектов под ключ
  • Собственные сайты в конкурентных нишах
  • SEO для ru/et/en в одной выдаче
Подробнее обо мне

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