Код состояния
Код состояния — это трёхзначное целое число, которое веб-сервер отправляет в ответ на запрос клиента (обычно браузера или поискового робота) по протоколу HTTP. Код состояния информирует о результате обработки запроса: был ли он успешно выполнен, произошла ли ошибка, или требуется дополнительное действие. Коды состояния стандартизированы в спецификациях HTTP/1.1 (RFC 7231) и более поздних версиях протокола, а их классификация основана на первой цифре числа.
История и стандартизация
Первая версия протокола HTTP (HTTP/0.9) не предусматривала кодов состояния — сервер просто возвращал запрошенные данные или ничего. В HTTP/1.0 (RFC 1945, 1996) были введены первые коды состояния, в основном трёхзначные числа, описывающие базовые сценарии: успех (200), перенаправление (302), ошибка клиента (404) и ошибка сервера (500). Дальнейшее развитие протокола в версии HTTP/1.1 (RFC 2616, 1999; затем RFC 7230–7235, 2014) значительно расширило список кодов, добавив новые классы и уточнив семантику существующих. В настоящее время поддержка кодов состояния является обязательной для любого HTTP-сервера.
Классификация по классам
Коды состояния делятся на пять классов, определяемых первой цифрой:
1xx (Информационные)
Коды 1xx информируют о том, что запрос принят и обрабатывается. Они не являются окончательными и используются редко. Основные коды:
- 100 Continue — сервер получил заголовки запроса и предлагает клиенту продолжить отправку тела запроса.
- 101 Switching Protocols — сервер соглашается переключиться на другой протокол (например, с HTTP на WebSocket) по запросу клиента.
2xx (Успешные)
Коды 2xx означают, что запрос был успешно получен, понят и обработан. Наиболее распространённые:
- 200 OK — стандартный ответ на успешный запрос. Тело ответа содержит запрошенные данные.
- 201 Created — запрос привёл к созданию нового ресурса (например, при POST-запросе).
- 204 No Content — запрос выполнен успешно, но тело ответа пусто (например, при DELETE-запросе).
3xx (Перенаправления)
Коды 3xx указывают, что для выполнения запроса клиенту необходимо предпринять дополнительные действия, чаще всего — перейти по другому URL. Ключевые коды:
- 301 Moved Permanently — запрашиваемый ресурс окончательно перемещён на новый URL. Браузеры и поисковые системы запоминают новый адрес.
- 302 Found (ранее Moved Temporarily) — ресурс временно доступен по другому URL. В отличие от 301, старый адрес остаётся основным.
- 304 Not Modified — используется для кэширования. Клиент может использовать свою локальную копию ресурса, так как с момента последнего запроса она не изменилась.
4xx (Ошибки клиента)
Коды 4xx означают, что ошибка произошла на стороне клиента: неверный синтаксис запроса, отсутствие доступа, запрос несуществующего ресурса. Самые известные:
- 400 Bad Request — сервер не может обработать запрос из-за синтаксической ошибки (например, неверно сформированный JSON).
- 401 Unauthorized — для доступа к ресурсу требуется аутентификация. В ответе обычно указывается метод аутентификации.
- 403 Forbidden — сервер понял запрос, но отказывается его выполнять (например, недостаточно прав).
- 404 Not Found — запрашиваемый ресурс не найден на сервере. Самый узнаваемый код ошибки в интернете.
- 429 Too Many Requests — клиент превысил лимит запросов за единицу времени (rate limiting).
5xx (Ошибки сервера)
Коды 5xx сигнализируют о том, что сервер не смог выполнить запрос по своей вине: из-за перегрузки, временной неисправности или внутренней ошибки. Основные коды:
- 500 Internal Server Error — общая ошибка сервера, когда причина не уточняется.
- 502 Bad Gateway — сервер (например, nginx) получил неверный ответ от вышестоящего сервера (например, от PHP-FPM).
- 503 Service Unavailable — сервер временно не может обработать запрос из-за перегрузки или технических работ.
- 504 Gateway Timeout — сервер не дождался ответа от вышестоящего сервера в установленное время.
Структура ответа с кодом состояния
HTTP-ответ состоит из трёх частей: строки состояния, заголовков и тела. Строка состояния включает версию протокола, код состояния и текстовую фразу (reason phrase), поясняющую код. Например: HTTP/1.1 200 OK. Текстовая фраза не является обязательной для понимания — её назначение — человекочитаемое описание.
Применение в веб-разработке
Коды состояния широко используются для диагностики и управления поведением клиентов:
- Поисковая оптимизация (SEO). Код 301 используется для склейки доменов и перенаправления трафика на основной адрес. Код 404 может привести к удалению страницы из индекса, если не настроено перенаправление.
- Кэширование. Код 304 позволяет браузерам и прокси-серверам использовать локальные копии, снижая нагрузку на сервер.
- API. RESTful API активно используют коды состояния: 200 для успешных GET-запросов, 201 для создания ресурсов, 400 для неверных входных данных, 401/403 для проблем с авторизацией, 500 для внутренних ошибок.
- Обработка ошибок. Разработчики настраивают кастомные страницы для кодов 404, 403, 500, чтобы улучшить пользовательский опыт.
Нестандартные и расширенные коды
Некоторые серверы и сервисы вводят собственные коды состояния, не входящие в стандарт. Например, nginx использует код 444 для закрытия соединения без ответа, а Cloudflare — 520 (Unknown Error), 521 (Web Server Is Down) и другие. Также существуют расширения стандарта, такие как коды состояния WebDAV (например, 207 Multi-Status для коллекций ресурсов).
Критика и ограничения
Хотя система кодов состояния универсальна, она имеет недостатки:
- Избыточность. Для многих сценариев достаточно 5–10 кодов, но их количество превышает 60, что может запутывать разработчиков.
- Неоднозначность. Один и тот же код может использоваться в разных контекстах. Например, 403 может означать как «доступ запрещён», так и «требуется аутентификация» (при отсутствии заголовка WWW-Authenticate).
- Отсутствие детализации. Код 500 скрывает истинную причину ошибки, что затрудняет отладку. Для решения этой проблемы в ответах API часто добавляют расширенное описание в теле ответа.
Источники
- RFC 7231 — Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content (2014)
- RFC 7235 — Hypertext Transfer Protocol (HTTP/1.1): Authentication (2014)
- RFC 7540 — Hypertext Transfer Protocol Version 2 (HTTP/2) (2015)
- «HTTP: The Definitive Guide» by David Gourley, Brian Totty (O'Reilly Media, 2002)
- Документация nginx и Apache HTTP Server (официальные сайты)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →