robots.txt и meta robots

Два разных инструмента управления ботом: robots.txt (обход) и meta robots (индексация) — их часто путают.

robots.txt управляет краулингом (можно ли скачивать URL). meta robots noindex управляет индексацией (можно ли класть страницу в индекс). Это разные стадии!

robots.txt

Это текстовый файл в корне сайта (/robots.txt), который рекомендует ботам, какие пути не обходить. Синтаксис простой:

User-agent: *
Disallow: /admin/
Disallow: /cart/
Disallow: /*?sort=
Allow: /

Sitemap: https://codechick.io/sitemap.xml

Ключевое: Disallow запрещает обход, а не индексацию. Если на закрытую в robots.txt страницу ведёт много ссылок, Google может всё равно показать её URL в выдаче — но без описания, потому что не смог скачать. Поэтому robots.txt — не способ скрыть страницу из индекса.

meta robots

Чтобы страница точно не попала в индекс, нужен мета-тег (или HTTP-заголовок X-Robots-Tag) на самой странице:

<!-- Не индексировать, но по ссылкам ходить можно -->
<meta name="robots" content="noindex, follow">

<!-- Не индексировать и не передавать вес по ссылкам -->
<meta name="robots" content="noindex, nofollow">

Важный парадокс: чтобы бот увидел noindex, он должен скачать страницу. Если вы одновременно закрыли её в robots.txt, бот не скачает страницу и не узнает про noindex — и URL может остаться в индексе. Эти два инструмента нельзя сочетать на одной странице.

Что чем закрывать

ЗадачаИнструмент
Не тратить бюджет на /admin, /cart, /apirobots.txt Disallow
Убрать страницу из выдачиmeta robots noindex (без robots.txt)
Не индексировать PDF/не-HTMLHTTP-заголовок X-Robots-Tag
Схлопнуть дубли (контент остаётся)canonical (не noindex)

Как работает под капотом: матчинг путей

Бот для каждого URL проверяет правила robots.txt и решает, можно ли его обходить. Упрощённая модель сопоставления с поддержкой *:

import re

disallow = ["/admin/", "/cart/", "/*?sort="]

def to_regex(rule):
    # экранируем спецсимволы, кроме '*', который -> '.*'
    esc = re.escape(rule).replace(r"\*", ".*")
    return re.compile("^" + esc)

patterns = [to_regex(r) for r in disallow]

def allowed(path):
    return not any(p.match(path) for p in patterns)

for path in ["/", "/blog/post", "/admin/users", "/shop?sort=price", "/cart/checkout"]:
    print(f"{'OK ' if allowed(path) else 'BLOCK'} {path}")

Вывод:

OK  /
OK  /blog/post
BLOCK /admin/users
BLOCK /shop?sort=price
BLOCK /cart/checkout

Частые ошибки

  • robots.txt, чтобы скрыть из выдачи — URL всё равно может появиться без описания. Для скрытия нужен noindex.
  • noindex + Disallow одновременно — бот не скачает страницу и не увидит noindex.
  • Случайный Disallow: / на проде — закрывает весь сайт (классика: забыли убрать после деплоя со стейджинга).
  • Закрыли CSS/JS — бот не сможет отрендерить страницу корректно.

Итог

  • robots.txt управляет обходом, meta robots noindex — индексацией; это разные стадии.
  • Чтобы убрать страницу из выдачи, используйте noindex и НЕ закрывайте её в robots.txt.
  • Никогда не оставляйте Disallow: / на проде и не блокируйте CSS/JS, нужные для рендера.
Проверьте себя
1. В чём разница между robots.txt Disallow и meta robots noindex?
AЭто одно и то же разными словами
BDisallow запрещает обход (краулинг), noindex запрещает индексацию — разные стадии
CDisallow работает только для Яндекса, noindex — для Google
Dnoindex запрещает обход, а Disallow — индексацию
2. Почему нельзя сочетать noindex и Disallow на одной странице?
AЭто удвоит нагрузку на сервер
BБот не скачает закрытую в robots.txt страницу и не увидит её noindex
Cnoindex отменяет robots.txt
DТакой синтаксис вызывает ошибку 500
3. Как надёжно убрать страницу из поисковой выдачи?
AЗакрыть её в robots.txt через Disallow
BПоставить meta robots noindex и НЕ блокировать страницу в robots.txt
CУдалить из sitemap.xml
DПоставить canonical на главную