Перед крупными изменениями сайт полезно проверить на отдельной копии. Обычно для этого создают поддомен вроде test.example.uz или staging.example.uz и кладут туда полную копию основного сайта. Проблема в том, что поисковые системы находят и этот поддомен: достаточно одной ссылки, файла sitemap или адреса, отправленного через браузерное расширение. В итоге в Google появляются два сайта с одинаковым текстом, а иногда клиент из поиска попадает на недоделанную тестовую страницу со старыми ценами или текстом «lorem ipsum».
Почему robots.txt недостаточно
Первое, что делают многие, — пишут в robots.txt строку Disallow: /. Это правило запрещает роботу сканировать страницы, но не гарантирует, что они не попадут в индекс. Если где-то есть ссылка на тестовый поддомен, Google может добавить адрес в индекс без содержимого, и в результатах он появится с пометкой о том, что информация о странице недоступна. Ещё важнее, что робот, не прочитав страницу, не увидит и её тег noindex, то есть совместное использование этих двух способов только мешает.
Поэтому надёжный подход для staging состоит из двух слоёв: роботу разрешают читать страницы, но в каждом ответе передают сигнал «не индексировать» или, что ещё лучше, закрывают сайт паролем.
Способ первый: заголовок X-Robots-Tag
HTTP-заголовок X-Robots-Tag — серверный аналог мета-тега robots. Его плюс в том, что он работает не только для HTML-страниц, но и для PDF, изображений и других файлов, а шаблоны редактировать не нужно. В Apache он прописывается через модуль mod_headers в .htaccess папки staging, в Nginx — в блоке server поддомена.
# .htaccess (только в папке staging!)
<IfModule mod_headers.c>
Header set X-Robots-Tag "noindex, nofollow"
</IfModule>
# Nginx: блок server для staging.example.uz
add_header X-Robots-Tag "noindex, nofollow" always;
Проверить работу настройки можно командой curl -I: среди заголовков ответа должна быть строка X-Robots-Tag: noindex, nofollow. Обязательно проверьте и ответ основного домена — правило, записанное не в ту папку, может выкинуть из поиска основной сайт.
curl -sI https://staging.example.uz | grep -i x-robots
curl -sI https://example.uz | grep -i x-robots # должно быть пусто
Способ второй: защита паролем
Самое надёжное решение — закрыть staging паролем. При включённом HTTP Basic Auth робот вместо страницы получает ответ 401 и ничего не может проиндексировать, а посторонние не видят недоделанных страниц. Файл паролей создаётся утилитой htpasswd, хранить его лучше вне папки сайта.
htpasswd -c /home/user/.htpasswd_staging tester
# .htaccess (Apache)
AuthType Basic
AuthName "Staging"
AuthUserFile /home/user/.htpasswd_staging
Require valid-user
# Nginx
auth_basic "Staging";
auth_basic_user_file /etc/nginx/.htpasswd_staging;
location /.well-known/acme-challenge/ { auth_basic off; }
Обратите внимание на последнюю строку: при проверке сертификата Let's Encrypt по HTTP проверяющий сервер не знает пароля, поэтому путь .well-known должен оставаться открытым, иначе SSL может перестать продлеваться. Если staging должен принимать обратные запросы от платёжной системы или внешнего API (webhook), для них тоже понадобится отдельное исключение.
Настройки WordPress и других CMS
В WordPress в разделе «Настройки → Чтение» есть флажок, который просит поисковые системы не индексировать сайт. Он добавляет на страницы мета-тег noindex и полезен как дополнительный слой защиты staging. Но этот флажок влияет только на страницы, которые генерирует WordPress, и хранится в базе данных, поэтому при переносе базы со staging на рабочий сайт он переезжает вместе с ней. Именно поэтому многие команды через несколько недель после запуска ищут, куда сайт исчез из поиска.
Если сайт уже попал в индекс
Если тестовый поддомен уже виден в результатах Google, сначала примените один из способов выше, а затем подтвердите поддомен как отдельный ресурс в Google Search Console. Инструмент «Удаления» (Removals) временно скрывает страницы из выдачи, а постоянный результат наступает, когда робот повторно посетит страницы и получит noindex или ответ 401. Для подтверждения поддомена нужно добавить TXT-запись в DNS — это можно сделать в разделе DNS домена в кабинете sayt.uz.
Пример: сайт школы в Намангане
Частная школа в Намангане два месяца готовила новый дизайн на поддомене yangi.misol.uz. За это время один из учителей отправил ссылку в родительский чат, и через несколько недель по запросу о приёме в поиске вместо основного сайта стала показываться тестовая копия. Разработчик закрыл поддомен паролем, временно удалил тестовые адреса через Search Console, а в день запуска, перенеся базу, проверил через curl, что на основном сайте нет ни X-Robots-Tag, ни noindex.
Чек-лист перед запуском
- Убедитесь, что в ответе основного домена нет заголовка
X-Robots-Tag. - Проверьте, что в коде страниц не осталось
<meta name="robots" content="noindex">. - Снимите в WordPress флажок, запрещающий индексацию.
- Убедитесь, что в
robots.txtне осталась строкаDisallow: /со staging. - Проверьте, что в канонических ссылках (
rel="canonical") и в sitemap нет адресов staging.