HTTP-коды состояния
Справочник по HTTP-кодам состояния (1xx–5xx) с объяснением наиболее распространённых и примером fetch(), ветвящегося по response.status.
Каждый раз, когда браузер загружает страницу, отправляет форму или JavaScript делает вызов fetch(), сервер отвечает трёхзначным HTTP-кодом состояния. Этот код сообщает клиенту, был ли запрос успешным, был ли он перенаправлен, завершился ли ошибкой по вине клиента или по вине сервера. Браузер использует его автоматически — следует перенаправлениям, показывает собственную страницу ошибки для некоторых кодов и повторно использует кэшированное содержимое для других, — но как разработчик вы также читаете эти коды напрямую: форма отправляется, и вы ветвитесь на основе ответа, или fetch() разрешается и вы проверяете response.ok (что просто означает «статус в диапазоне 200–299»).
Здесь вы найдёте список кодов состояния ответа протокола передачи гипертекста (HTTP). Эти коды отвечают на запрос клиента к серверу — независимо от того, использует ли запрос GET, POST или другой HTTP-метод — и они сгруппированы по 5 классам в зависимости от первой цифры. Знание этих кодов помогает отлаживать неработающие ссылки, неправильные URL, неудавшиеся отправки форм и неожиданные ответы API. Рассмотрим каждый класс:
Если вы получаете ответ, которого нет в этом списке, это означает, что он является нестандартным ответом, возможно специфичным для программного обеспечения сервера.
Обработка кодов состояния в JavaScript
Когда вы отправляете форму или вызываете API с помощью fetch(), запрос выполняется успешно (промис разрешается) даже когда сервер возвращает ошибку 4xx или 5xx — ответ 404 или 500 по-прежнему является допустимым HTTP-ответом, а не сетевой ошибкой. Поэтому вы должны самостоятельно проверять статус. Удобным сокращением является response.ok, который равен true только для диапазона 200–299; для всего остального вы ветвитесь на основе response.status, чтобы реагировать соответствующим образом:
const form = document.querySelector("#signup");
form.addEventListener("submit", async (event) => {
event.preventDefault();
const response = await fetch("/api/signup", {
method: "POST",
body: new FormData(form),
});
if (response.ok) {
// 200–299: success
window.location.href = "/welcome";
} else if (response.status === 401) {
showMessage("Please log in first.");
} else if (response.status === 422) {
// Validation errors returned as JSON
const data = await response.json();
showMessage(data.error);
} else if (response.status === 429) {
// Rate limited — respect the Retry-After header
const wait = response.headers.get("Retry-After");
showMessage(`Too many attempts. Try again in ${wait}s.`);
} else if (response.status >= 500) {
showMessage("Server error — please try again later.");
} else {
showMessage(`Unexpected error (${response.status}).`);
}
});Обратите внимание, что fetch() отклоняется только при реальных сетевых проблемах (нет соединения, блокировка CORS, ошибка DNS), поэтому оборачивание вызова в try…catch обрабатывает их, тогда как if/else выше обрабатывает сам HTTP-статус.
Наиболее важные коды, которые нужно знать в первую очередь. Если вам нужно запомнить лишь несколько, выберите эти: 200 (OK), 301 (Moved Permanently), 302 (Found / временное перенаправление), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found) и 500 (Internal Server Error). Они охватывают подавляющее большинство того, что вы увидите в инструментах разработчика браузера и журналах сервера.
1xx: Информационные
| Код состояния | Сообщение | Описание |
|---|---|---|
| 100 | Continue | Означает, что сервер получил заголовки запроса и клиент должен продолжить отправку тела запроса. |
| 101 | Switching Protocols | Означает, что клиент, сделавший запрос, попросил сервер сменить протоколы (например, перейти на соединение WebSocket). |
| 102 | Processing | Код WebDAV, означающий, что сервер принял запрос, но ещё не завершил его обработку; используется для предотвращения тайм-аута клиента при длительной операции. |
| 103 | Early Hints | Определён в RFC 8297. Позволяет серверу отправить некоторые заголовки ответа (например, заголовки Link для предварительной загрузки ресурсов) до окончательного ответа, чтобы браузер мог начать загрузку ресурсов раньше. |
2xx: Успешные
| Код состояния | Сообщение | Описание |
|---|---|---|
| 200 | OK | Означает, что запрос выполнен успешно. Это стандартный ответ на успешные HTTP-запросы. |
| 201 | Created | Означает, что запрос выполнен и был создан новый ресурс. |
| 202 | Accepted | Означает, что запрос принят в обработку, но обработка ещё не завершена. |
| 203 | Non-Authoritative Information | Означает, что запрос был успешно обработан, но возвращаемая информация может быть получена из другого источника. |
| 204 | No Content | Означает, что запрос был успешно обработан, но не возвращает никакого содержимого. |
| 205 | Reset Content | Означает, что запрос обработан, но не возвращает никакого содержимого и требует, чтобы инициатор запроса сбросил представление документа. |
| 206 | Partial Content | Означает, что сервер возвращает только часть ресурса из-за заголовка диапазона, отправленного клиентом. |
3xx: Перенаправления
| Код состояния | Сообщение | Описание |
|---|---|---|
| 300 | Multiple Choices | Указывает на несколько вариантов ресурса, из которых клиент может выбрать. |
| 301 | Moved Permanently | Означает, что страница была навсегда перемещена на новый URL. Браузеры и поисковые системы обновляют свои ссылки, поэтому код 301 передаёт ссылочный вес ссылки на новый URL и является правильным выбором для SEO-дружественных перенаправлений. |
| 302 | Found | Означает, что запрошенная страница временно перемещена на новый URL. Поисковые системы сохраняют индексацию исходного URL, поэтому используйте 302 (а не 301), когда перемещение кратковременное, например во время технического обслуживания или A/B-тестирования. |
| 303 | See Other | Означает, что ответ на запрос можно найти по другому URL, который клиент должен запросить методом GET. Обычно используется после отправки формы методом POST для перенаправления на страницу результата. |
| 304 | Not Modified | Означает, что запрошенный ресурс не изменился с момента последнего кэширования. Сервер не отправляет тело ответа, поэтому браузер повторно использует свою кэшированную копию — это экономит трафик и ускоряет повторные посещения. |
| 307 | Temporary Redirect | Означает, что запрошенная страница временно перемещена на новый URL. В отличие от 302, клиент должен сохранить исходный метод запроса (POST остаётся POST). |
| 308 | Permanent Redirect | Означает, что запрошенный ресурс навсегда перемещён на новый URL. |
Коды, не перечисленные здесь (например, 305 и 306), являются устаревшими, редкими или специфичными для расширений.
4xx: Ошибки клиента
| Код состояния | Сообщение | Описание |
|---|---|---|
| 400 | Bad Request | Означает, что запрос не может быть выполнен из-за неверного синтаксиса или недопустимых данных. |
| 401 | Unauthorized | Означает, что клиент не аутентифицирован — действительные учётные данные отсутствуют или неверны. Сервер ещё не знает кто вы, поэтому просит войти в систему. (Примечание: название говорит «Unauthorized», но по сути означает «Unauthenticated».) |
| 402 | Payment Required | Зарезервирован для будущего использования. |
| 403 | Forbidden | Означает, что клиент аутентифицирован, но не авторизован — сервер знает, кто вы, но у вас нет прав доступа к этому ресурсу. В отличие от 401, повторная отправка учётных данных не поможет. |
| 404 | Not Found | Означает, что запрошенная страница в данный момент не найдена, но может стать доступной в будущем. |
| 405 | Method Not Allowed | Означает, что запрос был выполнен к странице, которая не поддерживает указанный метод запроса. |
| 406 | Not Acceptable | Означает, что сервер может сгенерировать только ответ, который клиент не принимает. |
| 407 | Proxy Authentication Required | Означает, что клиент сначала должен аутентифицироваться через прокси. |
| 408 | Request Timeout | Означает, что сервер превысил время ожидания запроса. |
| 409 | Conflict | Означает, что запрос не может быть выполнен из-за конфликта в запросе. |
| 410 | Gone | Означает, что запрошенная страница больше недоступна. |
| 411 | Length Required | Означает, что длина содержимого не определена, и сервер не примет запрос без неё. |
| 412 | Precondition Failed | Означает, что предварительное условие, указанное в запросе, было оценено сервером как ложное. |
| 413 | Request Entity Too Large | Означает, что тело запроса слишком велико, поэтому сервер не примет запрос. |
| 414 | Request-URI Too Long | Означает, что URL слишком длинный, поэтому сервер не примет запрос. Это происходит при преобразовании POST-запроса в GET-запрос с длинной строкой запроса. |
| 415 | Unsupported Media Type | Означает, что тип медиа не поддерживается, поэтому сервер не примет запрос. |
| 416 | Requested Range Not Satisfiable | Означает, что клиент запросил часть файла, но сервер не может её предоставить. |
| 417 | Expectation Failed | Означает, что сервер не может выполнить требования поля заголовка запроса Expect. |
| 418 | I'm a Teapot | Шуточный код из RFC 2324 (Hyper Text Coffee Pot Control Protocol). Это не настоящая ошибка, но некоторые API намеренно его возвращают, так что вы можете с ним столкнуться. |
| 422 | Unprocessable Content | Означает, что запрос был правильно сформирован, но содержит семантические ошибки, препятствующие его обработке — обычно возвращается API, когда данные формы или JSON не проходят валидацию. |
| 429 | Too Many Requests | Означает, что клиент отправил слишком много запросов за определённый промежуток времени («ограничение скорости»). Ответ часто включает заголовок Retry-After, указывающий, сколько нужно подождать перед следующей попыткой. |
| 451 | Unavailable For Legal Reasons | Означает, что запрошенный ресурс недоступен по юридическим причинам, например из-за цензуры или требования об удалении (число отсылает к роману «451 градус по Фаренгейту»). |
Коды, не перечисленные здесь (например, 419, 420 и некоторые в диапазоне 423–431), являются редкими, специфичными для фреймворков или нестандартными. Некоторые — например, 421 (Misdirected Request, используется в HTTP/2) и 451 выше — стандартизированы, но редко встречаются в повседневной работе.
5xx: Ошибки сервера
| Код состояния | Сообщение | Описание |
|---|---|---|
| 500 | Internal Server Error | Является общей ошибкой; пользователи получают это сообщение об ошибке, когда нет более подходящего конкретного сообщения. |
| 501 | Not Implemented | Означает, что сервер не распознаёт метод запроса или не может его выполнить. |
| 502 | Bad Gateway | Означает, что сервер, действующий как шлюз, обратный прокси или балансировщик нагрузки, получил недопустимый ответ от вышестоящего сервера приложений — часто из-за того, что этот бэкенд аварийно завершился или вернул некорректный вывод. |
| 503 | Service Unavailable | Означает, что сервер временно не может обработать запрос (перегружен или находится на техническом обслуживании). Как и 429, ответ может включать заголовок Retry-After, сообщающий клиентам и поисковым роботам, когда повторить попытку, поэтому 503 является безопасным для SEO кодом при плановых простоях. |
| 504 | Gateway Timeout | Означает, что сервер, действующий как шлюз, обратный прокси или балансировщик нагрузки, не получил ответ от вышестоящего сервера в отведённое время. Указывает на медленный или неотзывчивый бэкенд, а не на сам прокси. |
| 505 | HTTP Version Not Supported | Означает, что версия протокола HTTP, использованная в запросе, не поддерживается сервером. |
| 507 | Insufficient Storage | Код WebDAV, означающий, что сервер не может сохранить представление, необходимое для выполнения запроса (недостаточно места для хранения). |
| 508 | Loop Detected | Код WebDAV, означающий, что сервер обнаружил бесконечный цикл при обработке запроса и прервал его. |
| 511 | Network Authentication Required | Означает, что клиенту необходимо пройти аутентификацию для получения доступа к сети (часто встречается за Wi-Fi с captive-порталом). |
Связанные главы
Статус, возвращаемый сервером, часто зависит от самого запроса. Для более глубокого изучения см.:
- HTTP-методы — GET, POST и другие, которые определяют поведение некоторых перенаправлений (302 против 307).
- HTML-формы — как отправка форм инициирует запросы, которые могут возвращать коды 303, 422 или 429.
- HTML URL (Uniform Resource Locators) — адреса, на которые указывают перенаправления 3xx и ответы 404.