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, /api | robots.txt Disallow |
| Убрать страницу из выдачи | meta robots noindex (без robots.txt) |
| Не индексировать PDF/не-HTML | HTTP-заголовок 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, нужные для рендера.