Коды состояния HTTP
| Формат | трёхзначное число и поясняющая фраза |
|---|---|
| Классы | 1xx, 2xx, 3xx, 4xx, 5xx |
| Спецификация | RFC 9110 (2022) |
| Реестр | IANA HTTP Status Code Registry |
| Самые известные | 200, 301, 404, 500 |
Коды состояния HTTP — трёхзначные числа в первой строке ответа HTTP-сервера, которые сообщают клиенту результат обработки запроса: успех, перенаправление, ошибка клиента или ошибка сервера. Рядом с кодом идёт короткая поясняющая фраза (reason phrase), например 404 Not Found, но программы ориентируются только на число. Коды определены в RFC 9110, а полный перечень ведёт IANA.[1][2]
Правильно выбранный код важен для API (REST), кэширования, поисковых систем и мониторинга: по доле ответов 5xx судят о здоровье сервиса.
Классы
Первая цифра задаёт класс ответа. Клиент, не знающий конкретного кода, обязан обработать его как код x00 своего класса — например, неизвестный 599 как 500.
| Класс | Значение |
|---|---|
| 1xx | информационный: запрос принят, обработка продолжается |
| 2xx | успех |
| 3xx | перенаправление: нужно дополнительное действие клиента |
| 4xx | ошибка клиента: запрос некорректен или не может быть выполнен |
| 5xx | ошибка сервера: запрос корректен, но сервер не справился |
Основные коды
1xx и 2xx
| Код | Название | Когда используется |
|---|---|---|
| 101 | Switching Protocols | переход на другой протокол, например WebSocket |
| 103 | Early Hints | ранние подсказки браузеру, какие ресурсы загружать |
| 200 | OK | успешный запрос |
| 201 | Created | ресурс создан; адрес — в заголовке Location |
| 202 | Accepted | запрос принят в асинхронную обработку |
| 204 | No Content | успех без тела ответа (часто на DELETE) |
| 206 | Partial Content | отдана часть ресурса по заголовку Range (докачка, видео) |
3xx
| Код | Название | Когда используется |
|---|---|---|
| 301 | Moved Permanently | ресурс переехал навсегда; поисковики переносят ссылочный вес |
| 302 | Found | временное перенаправление |
| 303 | See Other | после POST перейти на другой адрес методом GET |
| 304 | Not Modified | кэшированная копия актуальна, тело не передаётся |
| 307 | Temporary Redirect | временно, с сохранением метода и тела |
| 308 | Permanent Redirect | навсегда, с сохранением метода и тела |
Исторически браузеры при 301 и 302 меняли POST на GET; коды 307 и 308 введены, чтобы метод гарантированно сохранялся.
4xx
| Код | Название | Когда используется |
|---|---|---|
| 400 | Bad Request | синтаксически некорректный запрос |
| 401 | Unauthorized | нужна аутентификация (на деле — «не аутентифицирован») |
| 403 | Forbidden | пользователь известен, но прав нет |
| 404 | Not Found | ресурс не найден |
| 405 | Method Not Allowed | метод не поддерживается для этого адреса |
| 409 | Conflict | конфликт с текущим состоянием (дубликат, версия) |
| 410 | Gone | ресурс удалён навсегда |
| 413 | Content Too Large | слишком большое тело запроса |
| 415 | Unsupported Media Type | неподдерживаемый Content-Type |
| 422 | Unprocessable Content | синтаксис верен, но данные не проходят проверку |
| 429 | Too Many Requests | превышен лимит частоты; когда повторить — в Retry-After[4] |
| 451 | Unavailable For Legal Reasons | недоступно по юридическим причинам[5] |
Код 451 — отсылка к роману Брэдбери «451 градус по Фаренгейту». Шуточный код 418 I'm a teapot («Я чайник») появился в первоапрельском RFC 2324 (1998) и стал частью веб-фольклора.
5xx
| Код | Название | Когда используется |
|---|---|---|
| 500 | Internal Server Error | необработанная ошибка в приложении |
| 501 | Not Implemented | сервер не поддерживает функцию |
| 502 | Bad Gateway | прокси получил некорректный ответ от бэкенда |
| 503 | Service Unavailable | сервер перегружен или на обслуживании |
| 504 | Gateway Timeout | прокси не дождался ответа бэкенда |
Коды 502 и 504 обычно возвращает не само приложение, а обратный прокси вроде nginx: они означают, что бэкенд упал, недоступен или отвечает слишком долго.
Как выбирать код в API
- 401 или 403? 401 — клиент не представился или токен недействителен; повторить с правильными учётными данными. 403 — клиент известен, но действие ему запрещено.
- 400 или 422? 400 — запрос нельзя разобрать (сломанный JSON); 422 — разобрать можно, но значения неверны (email без
@). Многие фреймворки, например FastAPI, возвращают 422 при ошибке проверки данных. - 404 вместо 403 иногда возвращают сознательно, чтобы не раскрывать само существование закрытого ресурса.
- Не возвращайте 200 с ошибкой в теле (
{"ok": false}): это ломает кэширование, мониторинг и повторы на стороне клиента. - Повторять запрос автоматически имеет смысл при 429, 502, 503 и 504 — с паузой и экспоненциальной задержкой, но не при 4xx, означающих ошибку в самом запросе.
Подробности ошибки в API принято передавать в стандартном формате Problem Details (RFC 9457) с типом содержимого application/problem+json:[6]
{
"type": "https://example.com/errors/insufficient-funds",
"title": "Недостаточно средств",
"status": 409,
"detail": "На счёте 30 ₽, требуется 50 ₽."
}
Проверка кода ответа
curl -s -o /dev/null -w '%{http_code}\n' https://example.com # только код
curl -I https://example.com/old-page # заголовки, включая Location
Справочник с описанием каждого кода и примерами есть на MDN.[3] Утилита curl с флагом -f завершается ошибкой при кодах от 400, что удобно в скриптах.