Классы кодов, коротко
2xx — получилось. 200 OK — обычный ответ. 204 No Content — успешный запрос, которому нечего вернуть, обычное дело для API. 206 Partial Content — запрос диапазона, на котором держится перемотка видео и докачка файлов.
3xx — идите в другое место. 301 — постоянный, передаёт сигналы ранжирования; 302 — временный и не передаёт. 304 Not Modified — тихий код: у клиента уже есть действительная копия, поэтому тело ответа вообще не отправляется. У здорового сайта много 304.
4xx — запросу отказали. 400 — запрос некорректен, 401 — нужны учётные данные, 403 — осознанный отказ, 404 — не найдено, 410 — намеренно удалено навсегда, 429 — слишком много запросов.
5xx — отказала серверная сторона. 500 — необработанная ошибка, 502 — сломанный разговор с машиной позади, 503 — временный отказ, 504 — таймаут ожидания машины позади.
Какой узел выдал код
Запрос за CDN проходит как минимум через три места, каждое из которых может на него ответить: edge, веб-сервер вашего origin и ваше приложение. Каждое способно выдать коды, которые не может выдать никакое другое.
Только edge может выдать: попадание в кэш, отданное, пока origin лежит, 502 или 504 про ваш origin, 403 от правила WAF или гео-блокировки, а также 503 о том, что для хоста не настроен сервис.
Только веб-сервер вашего origin выдаёт: 403 из-за прав на файл или правила deny, 404 для пути, которого нет на диске, 413 для тела запроса больше допустимого.
Только ваше приложение выдаёт: 401 и 403 в зависимости от того, кто вошёл в систему, 422 для ошибки валидации, 500 из необработанного исключения.
Поэтому первый диагностический вопрос — не «что значит 502», а «дошёл ли этот запрос до моего origin вообще». Если его нет в логе доступа origin, никакие изменения на origin на него не повлияют.
Как найти узел по заголовкам
Ответ говорит, кто его обработал, — если смотреть на заголовки, а не на страницу.
curl -sI https://example.com/
Заголовок статуса кэша — на cdn.com.tr это X-Proxy-Cache-MT со значением HIT или MISS — означает, что запрос обработал edge. HIT означает, что к origin вообще не обращались, а это полезно знать, когда вы тестируете изменение и всё ещё видите старое поведение.
Здесь прячутся две ловушки. Первая: curl -I отправляет HEAD-запрос, а некоторые серверы и middleware ведут себя для HEAD иначе, чем для GET, так что заголовок, видимый на -I, может отсутствовать на настоящем GET, и наоборот. Когда это важно, используйте curl -sD - -o /dev/null с обычным GET. Вторая: закэшированный ответ с ошибкой продолжит отдаваться и после того, как вы исправите причину. Если код не меняется после исправления, сначала очистите кэш для этого пути, а уже потом продолжайте отладку.
Коды, которые стоит настраивать осознанно
301 против 302. Используйте 301, когда переезд постоянный, — он передаёт ранжирование старого URL новому. 302 оставляет старый URL каноническим, и это то, что нужно для временного редиректа кампании, но не то, что нужно после реструктуризации сайта. Редиректы кэшируются на edge, поэтому неверный переживёт даже деплой, который его создал.
404 против 410. Оба говорят «здесь этого нет». 410 добавляет «и не появится», из-за чего URL быстрее выпадает из индекса. Для страниц снятых с продажи товаров 410 — честный код.
503 с Retry-After. Во время обслуживания это пара, которая удерживает краулеров терпеливыми. Страница обслуживания, отданная с 200, говорит им, что ваше уведомление об обслуживании и есть ваш контент.
429 для rate limiting. Честнее, чем 503, когда отказ связан именно со скоростью запросов этого клиента. Не каждый стек отправляет его по умолчанию — rate limiting в nginx возвращает 503, если явно не настроено иначе.
Коды состояния, на которые вы реально потратите время
На практике три кода занимают большую часть времени отладки на сайте за прокси, и у каждого есть свой гайд:
**502 Bad Gateway** — edge не смог получить пригодный ответ от вашего origin. Четыре причины: отказ в соединении, ранний разрыв, сбой TLS-хендшейка, некорректный ответ.
**403 Forbidden** — что-то отказало намеренно. Пять возможных «решающих»: ваш origin, правило WAF, блокировка по стране или сети, защита от хотлинка, список IP. ID запроса на странице ошибки превращает гадание в поиск ответа.
**503 Service Unavailable** — временный отказ: перегрузка, обслуживание, rate limiting или edge без настроенного origin для этого хоста.
Четвёртый, 504, — таймаут-близнец 502, и он разобран в гайде про 502, потому что различать их — это и есть большая часть работы.
Частые вопросы
Какие коды состояния реально влияют на SEO?
Те, что меняют, что попадает в индекс: 301 передаёт значение URL целевому адресу, 302 — нет, 404 и 410 убирают URL из индекса, причём 410 быстрее, а долго висящий 5xx в итоге тоже роняет страницу из индекса. Тихо вредит именно 200, отданный на странице ошибки, — потому что текст ошибки индексируется как контент.
Почему curl и браузер показывают разные коды?
Запросы отличаются. Браузер отправляет cookie, другой user agent и заголовок Accept; curl обычно ничего из этого не отправляет. На сайте с WAF или обходом по login-cookie эти различия меняют решение. Прежде чем делать выводы, сравнивайте сопоставимое с сопоставимым.
304 — это ошибка?
Нет, это лучший исход после попадания в кэш: у клиента уже есть действительная копия, и сервер вообще не отправляет тело ответа. Много 304 в логах означает, что условные запросы работают как надо.
Что означает 000 или пустой статус в мониторинге?
То, что читать было нечего — HTTP-ответа не было: не резолвился DNS, не удалось TCP-соединение или не согласовался TLS. Это проблема связности, а не приложения, и её стоит отличать от 5xx в любой системе алертинга, которой вы пользуетесь.