Ошибка 403 кажется простой: «доступ запрещён», значит, так задумано. На деле её рисуют очень разные вещи — от забытых прав на файл до правила, которое отказывает всем, кто назвался роботом. Мы вызвали 403 на стенде шестью способами, а потом обошли 260 сайтов Екатеринбурга двенадцатью разными посетителями и посмотрели, кому сайты отказывают на самом деле.
Что говорит определение
Стандарт HTTP (RFC 9110, раздел 15.5.4) описывает 403 так: сервер понял запрос, но отказывается его выполнить. Причину сервер может объяснить в теле ответа, а может и не объяснять. Там же сказано, что сервер, который хочет скрыть сам факт существования ресурса, вправе ответить 404 вместо 403.
В справочнике кодов Яндекса:
403 Доступ к ресурсу запрещен/Forbidden — Доступ к документу запрещен. Если вы хотите, чтобы страница индексировалась, необходимо разрешить доступ к ней.
Главное отличие от соседей: 404 — «такого нет», 401 — «представьтесь», 5xx — «сервер сломался». 403 — «есть, работает, но тебе не дам».
Стенд: шесть способов получить 403
Собрали nginx 1.22.1 с отдельной папкой под каждую поломку и записали, что видит посетитель и что остаётся в журнале ошибок сервера.
| Что сделали | Ответ | Строка в журнале ошибок |
|---|---|---|
| Папка без index.html, листинг выключен | 403 | directory index of "…/" is forbidden |
| Файлу сняли все права (chmod 000) | 403 | open() "…/index.html" failed (13: Permission denied) |
| Папке-родителю сняли право входа | 403 | "…/index.html" is forbidden (13: Permission denied) |
Правило deny all на папку | 403 | access forbidden by rule |
Запрет скрытых файлов, запрос /.env | 403 | access forbidden by rule |
| Отказ по имени агента (AhrefsBot) | 403 | ничего |
| Та же папка, обычный браузер | 200 | — |
| Несуществующая папка — для сравнения | 404 | is not found (2: No such file or directory) |
Посетитель во всех шести случаях видит одну и ту же страницу «403 Forbidden». Различить причины можно только по журналу ошибок, и пять из шести там оставили точную строку.
Шестой случай — самый неприятный. Правило вида «если агент такой-то — вернуть 403» срабатывает до чтения файлов, поэтому журнал ошибок молчит: с точки зрения сервера ошибки не было, он сделал то, что велели. Такой отказ виден только в журнале доступа, где рядом с кодом 403 записан агент. Кто ищет причину 403 в журнале ошибок, эту не найдёт никогда.
Обход: двенадцать посетителей на 260 сайтах
Двенадцать агентов — это двенадцать строк, которыми посетитель себя называет: браузер из России, браузер из Европы, YandexBot, Googlebot, Bingbot, AhrefsBot, SemrushBot, GPTBot, ClaudeBot, curl, python-requests и запрос вовсе без имени. Каждый сайт спрашивали всеми двенадцатью подряд, с паузой полторы секунды между агентами. Обход прошёл 23 сентября.
Браузеру из России ответили 200 на 241 сайте из 260 — от них и считаем. Каждый отказ перепроверили повторным запросом тем же агентом, а браузер спросили ещё раз рядом. В таблицу попали только отказы, которые повторились, а браузер при этом снова получил 200.
| Кто спрашивал | Отказов из 241 | 403 | 503 | Обрыв без ответа | Прочее |
|---|---|---|---|---|---|
| SemrushBot | 114 | 37 | 23 | 46 | 8 |
| AhrefsBot | 110 | 33 | 23 | 45 | 9 |
| GPTBot | 68 | 8 | 9 | 47 | 4 |
| ClaudeBot | 52 | 30 | 1 | 16 | 5 |
| Bingbot | 47 | 9 | — | 36 | 2 |
| python-requests | 13 | 9 | — | 2 | 2 |
| Запрос без имени | 3 | 2 | — | — | 1 |
| curl | 2 | — | — | 2 | — |
| Браузер из Европы | 1 | — | — | — | 1 |
| YandexBot | 0 | — | — | — | — |
| Googlebot | 0 | — | — | — | — |
Всего хотя бы одному агенту отказали 120 сайтов из 241 — ровно половина. Отказывают сразу нескольким: одному агенту — 7 сайтов, двум — 17, трём — 34, четырём — 49, пяти и больше — 13.
Порядок запросов не объясняет отказы. curl, python-requests и запрос без имени шли после роботов, то есть в самой «подозрительной» части серии, и получили 200 почти везде. Значит, дело не в частоте запросов, а в том, как посетитель назвался.
Отдельно о двух нулях внизу таблицы. Ни один сайт не отказал поддельным YandexBot и Googlebot — мы только называли себя этими роботами, с чужого адреса. То есть подлинность поисковых роботов эти сайты либо не проверяют, либо проверяют, но поддельного всё равно пускают. Для сравнения: в прошлом замере доступности для роботов на выборке из 75 сайтов один отдавал 403 роботу Яндекса.
Три лица одного отказа
Если судить только по коду 403, отказов в таблице окажется вдвое меньше, чем их есть. Сервер говорит «нет» тремя способами.
403 Forbidden. Честный отказ. Тела ответов в первом проходе: 95 раз стандартная страница nginx, 11 раз страница DDoS-Guard, 3 раза — Qrator.
503 Service Temporarily Unavailable. Выглядит как временная поломка,
но поломки нет: тот же сайт в ту же секунду отвечает браузеру 200. Все 23
таких сайта отвечали с одинаковой подписью сервера nginx-reuseport/1.21.1
и одной и той же стандартной страницей — похоже на общее правило у одного
хостинга, а не на решение каждого владельца.
Обрыв без ответа. Самый частый вид отказа: сервер принимает соединение
и сбрасывает его, не отправив ни кода, ни страницы. Почти всегда это сброс
потока HTTP/2, пару раз — пустой ответ. Так отказывали в основном сервера с
подписью nginx, реже openresty. Для инструмента проверки такой отказ
неотличим от упавшего сайта.
Отказы ходят пачками. Самые частые сочетания: обрыв для Ahrefs, Bing, GPTBot и Semrush сразу — 31 сайт; обрыв для Ahrefs, ClaudeBot, GPTBot и Semrush — 10 сайтов; 403 для Ahrefs, ClaudeBot и Semrush — 15 сайтов. Это похоже на готовые списки «плохих ботов», которые включают целиком, а не на решение про каждого робота.
Что 403 значит для поиска
Для Яндекса 403 — не просто ошибка, а указание. В разделе об удалении страниц из поиска справка называет способ — «HTTP-статус с кодом 404, 403 или 410» — и срок:
Из поисковой базы страница будет удалена в течение недели после того, как робот обнаружит ваши указания.
Там же Яндекс сам советует ставить 403 на личные страницы:
Для страниц с авторизацией, которые содержат личные данные (адрес доставки, телефон, платежная информация), настройте HTTP-код ответа сервера 403 Forbidden.
Отсюда простое правило. 403 на корзине, личном кабинете и /.env —
правильно. 403 на обычной странице, пришедший роботу поиска, — это
просьба убрать её из выдачи, даже если владелец ничего такого не просил.
С остальными роботами иначе. Отказ Ahrefs и Semrush не влияет на поиск Яндекса, но их базами ссылок пользуются другие владельцы и SEO-специалисты: закрытый от них сайт хуже виден в их отчётах. Отказ GPTBot и ClaudeBot убирает сайт из того, что читают ИИ-помощники — подробнее в разборе ИИ-краулеров. Если закрывать, то осознанно и лучше через robots.txt: его правила видны, а отказ по агенту на сервере не видит никто, включая самого владельца.
Как проверить у себя
- Откройте страницу обычным браузером и запросите её от имени робота.
Достаточно
curl -I -A "YandexBot/3.0" https://ваш-сайт/. Разный код для человека и робота — отказ по агенту. - Обрыв тоже считайте отказом. Если curl завершился ошибкой без кода, а браузер страницу получил — это он.
- Смотрите журнал ошибок сервера. Строки
forbidden,Permission denied,access forbidden by ruleназывают причину сразу. - Журнал ошибок пуст — смотрите журнал доступа. Найдите строку с 403 и прочитайте агента в её конце.
- Проверьте защиту от атак и хостинг. Страница DDoS-Guard или Qrator вместо сайта, одинаковый 503 на соседних сайтах — правило не ваше, его меняют в настройках сервиса или через поддержку.
Наш сайт на тех же агентах отвечает 200 всем, включая запрос без имени и ИИ-краулеры: закрывать нам нечего, а кто читает — тот и находит.
Чего мы проверить не смогли
- Настоящих роботов. Мы только называли себя YandexBot и Googlebot. Сайт, который проверяет робота по обратному DNS, настоящему ответит иначе, чем нам.
- Совпадает ли отказ с robots.txt. Закрывают ли эти же сайты Ahrefs и GPTBot ещё и в robots.txt, мы не сверяли.
- Кто ставит правило. Владелец, хостинг или защита от атак — видно по подписи ответа лишь частично; одинаковый 503 на 23 сайтах указывает на хостинг, но подтверждения от него у нас нет.
- Содержимое ответов 200. Мы сравнивали коды, а не страницы. Сайт, который отдаёт роботу 200 с пустой или другой страницей, в эту таблицу не попал.
Границы замера
Выборка — 260 сайтов компаний Екатеринбурга, считали по 241, открытых браузеру. Один обход 23 сентября, каждый отказ подтверждён одним повтором; из первичных расхождений 14 при повторе не подтвердились и выброшены. Запросы шли с одного адреса в России, «браузер из Европы» — с одного адреса в Германии. Стенд — nginx 1.22.1 с настройками по умолчанию; Apache и другие серверы пишут в журнал иначе.
Коротко
- 403 — «страница есть, но тебе не дам». Посетитель видит одну и ту же страницу при шести разных причинах.
- Пять причин из шести оставляют строку в журнале ошибок. Отказ по имени агента не оставляет ничего — ищите его в журнале доступа.
- Половина сайтов, открытых браузеру, отказывает хотя бы одному роботу: Semrush и Ahrefs — почти каждый второй сайт, GPTBot — больше чем каждый четвёртый.
- Отказ часто выглядит не как 403, а как 503 или обрыв без ответа.
- Для Яндекса 403 — просьба убрать страницу из поиска в течение недели. Ставить её стоит на личные страницы, а не на всё подряд.
