# Коды состояния HTTP

> Трёхзначные числовые коды в ответе HTTP-сервера, сообщающие результат обработки запроса — от 200 OK до 404 Not Found и 500 Internal Server Error.

Источник: https://llmdocs.ru/wiki/http-status-codes/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Формат**: трёхзначное число и поясняющая фраза
- **Классы**: 1xx, 2xx, 3xx, 4xx, 5xx
- **Спецификация**: RFC 9110 (2022)
- **Реестр**: IANA HTTP Status Code Registry
- **Самые известные**: 200, 301, 404, 500
**Коды состояния HTTP** — трёхзначные числа в первой строке ответа [HTTP](https://llmdocs.ru/wiki/http.md)-сервера, которые сообщают клиенту результат обработки запроса: успех, перенаправление, ошибка клиента или ошибка сервера. Рядом с кодом идёт короткая поясняющая фраза (*reason phrase*), например `404 Not Found`, но программы ориентируются только на число. Коды определены в RFC 9110, а полный перечень ведёт IANA.[1][2]

Правильно выбранный код важен для API ([REST](https://llmdocs.ru/wiki/rest.md)), кэширования, поисковых систем и мониторинга: по доле ответов 5xx судят о здоровье сервиса.

## Классы

Первая цифра задаёт класс ответа. Клиент, не знающий конкретного кода, обязан обработать его как код `x00` своего класса — например, неизвестный `599` как `500`.

| Класс | Значение |
|---|---|
| 1xx | информационный: запрос принят, обработка продолжается |
| 2xx | успех |
| 3xx | перенаправление: нужно дополнительное действие клиента |
| 4xx | ошибка клиента: запрос некорректен или не может быть выполнен |
| 5xx | ошибка сервера: запрос корректен, но сервер не справился |

## Основные коды

### 1xx и 2xx

| Код | Название | Когда используется |
|---|---|---|
| 101 | Switching Protocols | переход на другой протокол, например [WebSocket](https://llmdocs.ru/wiki/websocket.md) |
| 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 обычно возвращает не само приложение, а [обратный прокси](https://llmdocs.ru/wiki/reverse-proxy.md) вроде [nginx](https://llmdocs.ru/wiki/nginx.md): они означают, что бэкенд упал, недоступен или отвечает слишком долго.

## Как выбирать код в API

- **401 или 403?** 401 — клиент не представился или токен недействителен; повторить с правильными учётными данными. 403 — клиент известен, но действие ему запрещено.
- **400 или 422?** 400 — запрос нельзя разобрать (сломанный [JSON](https://llmdocs.ru/wiki/json.md)); 422 — разобрать можно, но значения неверны (email без `@`). Многие фреймворки, например [FastAPI](https://llmdocs.ru/wiki/fastapi.md), возвращают 422 при ошибке проверки данных.
- **404 вместо 403** иногда возвращают сознательно, чтобы не раскрывать само существование закрытого ресурса.
- **Не возвращайте 200 с ошибкой в теле** (`{"ok": false}`): это ломает кэширование, мониторинг и повторы на стороне клиента.
- Повторять запрос автоматически имеет смысл при 429, 502, 503 и 504 — с паузой и экспоненциальной задержкой, но не при 4xx, означающих ошибку в самом запросе.

Подробности ошибки в API принято передавать в стандартном формате **Problem Details** (RFC 9457) с типом содержимого `application/problem+json`:[6]

```json
{
  "type": "https://example.com/errors/insufficient-funds",
  "title": "Недостаточно средств",
  "status": 409,
  "detail": "На счёте 30 ₽, требуется 50 ₽."
}
```

## Проверка кода ответа

```bash
curl -s -o /dev/null -w '%{http_code}\n' https://example.com   # только код
curl -I https://example.com/old-page                           # заголовки, включая Location
```

Справочник с описанием каждого кода и примерами есть на MDN.[3] Утилита [curl](https://llmdocs.ru/wiki/curl.md) с флагом `-f` завершается ошибкой при кодах от 400, что удобно в скриптах.

## См. также

- [HTTP](https://llmdocs.ru/wiki/http.md)
- [REST](https://llmdocs.ru/wiki/rest.md)
- [curl](https://llmdocs.ru/wiki/curl.md)
- [Обратный прокси (reverse proxy)](https://llmdocs.ru/wiki/reverse-proxy.md)

## Источники

1. [RFC 9110 — HTTP Semantics, Section 15: Status Codes](https://www.rfc-editor.org/rfc/rfc9110#section-15)
2. [IANA — HTTP Status Code Registry](https://www.iana.org/assignments/http-status-codes/)
3. [MDN — HTTP response status codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status)
4. [RFC 6585 — Additional HTTP Status Codes (428, 429, 431, 511)](https://www.rfc-editor.org/rfc/rfc6585)
5. [RFC 7725 — An HTTP Status Code to Report Legal Obstacles (451)](https://www.rfc-editor.org/rfc/rfc7725)
6. [RFC 9457 — Problem Details for HTTP APIs](https://www.rfc-editor.org/rfc/rfc9457)
