W3docs

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: Информационные

Код состоянияСообщениеОписание
100ContinueОзначает, что сервер получил заголовки запроса и клиент должен продолжить отправку тела запроса.
101Switching ProtocolsОзначает, что клиент, сделавший запрос, попросил сервер сменить протоколы (например, перейти на соединение WebSocket).
102ProcessingКод WebDAV, означающий, что сервер принял запрос, но ещё не завершил его обработку; используется для предотвращения тайм-аута клиента при длительной операции.
103Early HintsОпределён в RFC 8297. Позволяет серверу отправить некоторые заголовки ответа (например, заголовки Link для предварительной загрузки ресурсов) до окончательного ответа, чтобы браузер мог начать загрузку ресурсов раньше.

2xx: Успешные

Код состоянияСообщениеОписание
200OKОзначает, что запрос выполнен успешно. Это стандартный ответ на успешные HTTP-запросы.
201CreatedОзначает, что запрос выполнен и был создан новый ресурс.
202AcceptedОзначает, что запрос принят в обработку, но обработка ещё не завершена.
203Non-Authoritative InformationОзначает, что запрос был успешно обработан, но возвращаемая информация может быть получена из другого источника.
204No ContentОзначает, что запрос был успешно обработан, но не возвращает никакого содержимого.
205Reset ContentОзначает, что запрос обработан, но не возвращает никакого содержимого и требует, чтобы инициатор запроса сбросил представление документа.
206Partial ContentОзначает, что сервер возвращает только часть ресурса из-за заголовка диапазона, отправленного клиентом.

3xx: Перенаправления

Код состоянияСообщениеОписание
300Multiple ChoicesУказывает на несколько вариантов ресурса, из которых клиент может выбрать.
301Moved PermanentlyОзначает, что страница была навсегда перемещена на новый URL. Браузеры и поисковые системы обновляют свои ссылки, поэтому код 301 передаёт ссылочный вес ссылки на новый URL и является правильным выбором для SEO-дружественных перенаправлений.
302FoundОзначает, что запрошенная страница временно перемещена на новый URL. Поисковые системы сохраняют индексацию исходного URL, поэтому используйте 302 (а не 301), когда перемещение кратковременное, например во время технического обслуживания или A/B-тестирования.
303See OtherОзначает, что ответ на запрос можно найти по другому URL, который клиент должен запросить методом GET. Обычно используется после отправки формы методом POST для перенаправления на страницу результата.
304Not ModifiedОзначает, что запрошенный ресурс не изменился с момента последнего кэширования. Сервер не отправляет тело ответа, поэтому браузер повторно использует свою кэшированную копию — это экономит трафик и ускоряет повторные посещения.
307Temporary RedirectОзначает, что запрошенная страница временно перемещена на новый URL. В отличие от 302, клиент должен сохранить исходный метод запроса (POST остаётся POST).
308Permanent RedirectОзначает, что запрошенный ресурс навсегда перемещён на новый URL.

Коды, не перечисленные здесь (например, 305 и 306), являются устаревшими, редкими или специфичными для расширений.

4xx: Ошибки клиента

Код состоянияСообщениеОписание
400Bad RequestОзначает, что запрос не может быть выполнен из-за неверного синтаксиса или недопустимых данных.
401UnauthorizedОзначает, что клиент не аутентифицирован — действительные учётные данные отсутствуют или неверны. Сервер ещё не знает кто вы, поэтому просит войти в систему. (Примечание: название говорит «Unauthorized», но по сути означает «Unauthenticated».)
402Payment RequiredЗарезервирован для будущего использования.
403ForbiddenОзначает, что клиент аутентифицирован, но не авторизован — сервер знает, кто вы, но у вас нет прав доступа к этому ресурсу. В отличие от 401, повторная отправка учётных данных не поможет.
404Not FoundОзначает, что запрошенная страница в данный момент не найдена, но может стать доступной в будущем.
405Method Not AllowedОзначает, что запрос был выполнен к странице, которая не поддерживает указанный метод запроса.
406Not AcceptableОзначает, что сервер может сгенерировать только ответ, который клиент не принимает.
407Proxy Authentication RequiredОзначает, что клиент сначала должен аутентифицироваться через прокси.
408Request TimeoutОзначает, что сервер превысил время ожидания запроса.
409ConflictОзначает, что запрос не может быть выполнен из-за конфликта в запросе.
410GoneОзначает, что запрошенная страница больше недоступна.
411Length RequiredОзначает, что длина содержимого не определена, и сервер не примет запрос без неё.
412Precondition FailedОзначает, что предварительное условие, указанное в запросе, было оценено сервером как ложное.
413Request Entity Too LargeОзначает, что тело запроса слишком велико, поэтому сервер не примет запрос.
414Request-URI Too LongОзначает, что URL слишком длинный, поэтому сервер не примет запрос. Это происходит при преобразовании POST-запроса в GET-запрос с длинной строкой запроса.
415Unsupported Media TypeОзначает, что тип медиа не поддерживается, поэтому сервер не примет запрос.
416Requested Range Not SatisfiableОзначает, что клиент запросил часть файла, но сервер не может её предоставить.
417Expectation FailedОзначает, что сервер не может выполнить требования поля заголовка запроса Expect.
418I'm a TeapotШуточный код из RFC 2324 (Hyper Text Coffee Pot Control Protocol). Это не настоящая ошибка, но некоторые API намеренно его возвращают, так что вы можете с ним столкнуться.
422Unprocessable ContentОзначает, что запрос был правильно сформирован, но содержит семантические ошибки, препятствующие его обработке — обычно возвращается API, когда данные формы или JSON не проходят валидацию.
429Too Many RequestsОзначает, что клиент отправил слишком много запросов за определённый промежуток времени («ограничение скорости»). Ответ часто включает заголовок Retry-After, указывающий, сколько нужно подождать перед следующей попыткой.
451Unavailable For Legal ReasonsОзначает, что запрошенный ресурс недоступен по юридическим причинам, например из-за цензуры или требования об удалении (число отсылает к роману «451 градус по Фаренгейту»).

Коды, не перечисленные здесь (например, 419, 420 и некоторые в диапазоне 423–431), являются редкими, специфичными для фреймворков или нестандартными. Некоторые — например, 421 (Misdirected Request, используется в HTTP/2) и 451 выше — стандартизированы, но редко встречаются в повседневной работе.

5xx: Ошибки сервера

Код состоянияСообщениеОписание
500Internal Server ErrorЯвляется общей ошибкой; пользователи получают это сообщение об ошибке, когда нет более подходящего конкретного сообщения.
501Not ImplementedОзначает, что сервер не распознаёт метод запроса или не может его выполнить.
502Bad GatewayОзначает, что сервер, действующий как шлюз, обратный прокси или балансировщик нагрузки, получил недопустимый ответ от вышестоящего сервера приложений — часто из-за того, что этот бэкенд аварийно завершился или вернул некорректный вывод.
503Service UnavailableОзначает, что сервер временно не может обработать запрос (перегружен или находится на техническом обслуживании). Как и 429, ответ может включать заголовок Retry-After, сообщающий клиентам и поисковым роботам, когда повторить попытку, поэтому 503 является безопасным для SEO кодом при плановых простоях.
504Gateway TimeoutОзначает, что сервер, действующий как шлюз, обратный прокси или балансировщик нагрузки, не получил ответ от вышестоящего сервера в отведённое время. Указывает на медленный или неотзывчивый бэкенд, а не на сам прокси.
505HTTP Version Not SupportedОзначает, что версия протокола HTTP, использованная в запросе, не поддерживается сервером.
507Insufficient StorageКод WebDAV, означающий, что сервер не может сохранить представление, необходимое для выполнения запроса (недостаточно места для хранения).
508Loop DetectedКод WebDAV, означающий, что сервер обнаружил бесконечный цикл при обработке запроса и прервал его.
511Network Authentication RequiredОзначает, что клиенту необходимо пройти аутентификацию для получения доступа к сети (часто встречается за Wi-Fi с captive-порталом).

Связанные главы

Статус, возвращаемый сервером, часто зависит от самого запроса. Для более глубокого изучения см.:

  • HTTP-методы — GET, POST и другие, которые определяют поведение некоторых перенаправлений (302 против 307).
  • HTML-формы — как отправка форм инициирует запросы, которые могут возвращать коды 303, 422 или 429.
  • HTML URL (Uniform Resource Locators) — адреса, на которые указывают перенаправления 3xx и ответы 404.

Практика

Практика
Авторизованный пользователь запрашивает страницу, доступ к которой ему запрещён. Какой код состояния должен вернуть сервер?
Авторизованный пользователь запрашивает страницу, доступ к которой ему запрещён. Какой код состояния должен вернуть сервер?
Практика
Вы навсегда перемещаете страницу на новый URL и хотите, чтобы поисковые системы передали рейтинговые сигналы на новый адрес. Какой код перенаправления следует использовать?
Вы навсегда перемещаете страницу на новый URL и хотите, чтобы поисковые системы передали рейтинговые сигналы на новый адрес. Какой код перенаправления следует использовать?
Практика
Отправка формы методом POST прошла успешно, и сервер хочет сообщить браузеру, чтобы тот очистил поля формы, не отправляя никакого нового содержимого страницы. Какой код состояния подходит лучше всего?
Отправка формы методом POST прошла успешно, и сервер хочет сообщить браузеру, чтобы тот очистил поля формы, не отправляя никакого нового содержимого страницы. Какой код состояния подходит лучше всего?
Was this page helpful?