Коды состояния ответа HTTP

http-status-codes-1.jpg

Код ответа является сообщением, которое сервер отправляет клиенту в ответ на запрос. Стандартизированный код состояния состоит из трех цифр. Коды состояния ответа (response status codes) показывают, был ли успешно выполнен определённый HTTP запрос (request). Они определены в стандарте RFC 9110 и сгруппированы по группам:

  1. Информационные ответы, не ошибка (100 – 199)
  2. Успешные ответы, не ошибка (200 – 299)
  3. Сообщения о перенаправлении, не ошибка (300 – 399)
  4. Ошибки клиента (400 – 499)
  5. Ошибки сервера (500 – 599)

Информационные (100 – 199)

  • 100 Continue - промежуточный ответ, указывающий, что клиент должен продолжить запрос или игнорировать этот ответ, если запрос уже завершен
  • 101 Switching Protocols - отправляется в ответ на заголовок запроса Upgrade от клиента и указывает протокол, на который переключается сервер
  • 102 Processing (WebDAV) - означает, что сервер получил и обрабатывает запрос, но ответа пока нет
  • 103 Early Hints - код в первую очередь предназначен для использования с заголовком Link (предварительная загрузка ресурсов или предварительное соединение к источнику ресурсов, пока сервер готовит ответ)

Успешные (200 – 299)

  • 200 OK - успешно выполненный запрос, успех» зависит от метода HTTP:
    • GET: ресурс был получен и передан в теле сообщения
    • HEAD: ответ содержит заголовки, но тела сообщения нет
    • PUT или POST: ресурс, описывающий результат действия, передан в body сообщения
    • TRACE: тело сообщения содержит сообщение запроса, полученное сервером
  • 201 Created - запрос выполнен успешно, и в результате был создан новый ресурс. Обычно отправляется на запросы POST или PUT
  • 202 Accepted - запрос получен, но еще не обработан. Этот код предназначен для случаев, когда запрос обрабатывается другим процессом или сервером, а также для пакетной обработки (т.к. в HTTP нет возможности позже отправить асинхронный ответ с результатом обработки запроса)
  • 204 No Content - для этого запроса нет содержимого для отправки, но заголовки ответа могут быть полезны. Можно использовать для обновления закешированных заголовков, полученных ранее для этого ресурса
  • 205 Reset Content - сообщает пользовательскому агенту, что необходимо сбросить отображение документа, который отправил этот запрос

Перенаправление (300 – 399)

  • 300 Multiple Choices - у запроса более одного возможного ответа. Пользовательский агент или пользователь должен выбрать один из них
  • 301 Moved Permanently - URL-адрес запрошенного ресурса был изменен навсегда. Новый URL-адрес указан в ответе в заголовке Location
  • 302 Found - URI запрошенного ресурса был временно изменен. В будущем могут быть внесены дальнейшие изменения в URI. В ответе указывается новый адрес запрашиваемого URL
  • 303 See Other - указывает, что запрошенная страница находится по другому адресу. Клиенту необходимо получить запрошенный ресурс по другому URI с помощью запроса GET
  • 304 Not Modified - этот код используется для целей кэширования и означает, что страница не изменялась с момента последнего обращения робота. Ускоряет индексирование и экономит трафик
  • 305 Use Proxy (устарело) - запрошенный ответ должен быть доступен через прокси. Код в настоящее время устарел из-за проблем безопасности, связанных с внутренней настройкой прокси-сервера
  • 306 unused - этот код ответа зарезервирован. Использовался в предыдущей версии спецификации HTTP/1.1
  • 307 Temporary Redirect - клиенту необходимо получить запрошенный ресурс по другому URI тем же методом, который использовался в предыдущем запросе. Имеет ту же семантику, что и код 302 Found, за исключением того, что пользовательский агент не должен изменять используемый метод
  • 308 Permanent Redirect - ресурс теперь находится по другому URI, указанному в заголовке ответа Location. Имеет ту же семантику, что и код ответа 301 Moved Permanently, за исключением того, что пользовательский агент не должен изменять используемый метод

Ошибки клиента (400 – 499)

400.jpg

  • 400 Bad Request - сервер не может или не будет обрабатывать "плохой" запрос. Ошибка возникает в случае, если клиент отправляет некорректный запрос (ошибка синтаксиса, формат или маршрутизация запроса)
  • 401 Unauthorized - хотя стандарт определяет этот ответ как «неавторизованный», семантически он означает «неаутентифицированный». Это значит, что клиент должен аутентифицировать себя (допустим, ввести логин и пароль), чтобы получить запрошенный ответ
  • 402 Payment Required - экспериментальная возможность, код ответа зарезервирован для использования в будущем. Изначальная цель - использование в цифровых платежных системах, но используется очень редко
  • 403 Forbidden - клиент не имеет прав доступа к контенту, то есть он неавторизован, поэтому сервер отказывается предоставить запрошенный ресурс. В отличие от 401 Unauthorized, личность клиента известна серверу (т.е. клиент аутентифицирован, но не имеет прав для получения ответа)
  • 404 Not Found - сервер не может найти запрошенный ресурс. В браузере это означает, что URL-адрес не распознан. В API это также может означать, что адрес правильный, но ресурс не существует
  • 405 Method Not Allowed - метод запроса известен серверу, но не поддерживается целевым ресурсом. Например, API может не разрешать вызов DELETE для удаления ресурса, однако доступные методы API содержатся в ответе в заголовке Allow
  • 406 Not Acceptable - сервер после выполнения согласования контента не нашёл содержимого, соответствующего критериям, заданным пользовательским агентом. Запрашиваемый контент не может быть распознан из-за кодировки, метода сжатия и др. причин
  • 407 Proxy Authentication Required - этот код ответа похож на 401 Unauthorized, но аутентификация должна выполняться через прокси-сервер (сервер-посредник)
  • 408 Request Timeout - означает, что сервер хотел бы закрыть это соединение, так как обработка запроса пользователя вышла за рамки установленного времени. Клиенту необходимо проверить интернет-соединение и обновить страницу. Некоторые серверы просто закрывают соединение, не отправляя это сообщение
  • 409 Conflict - запрос конфликтует с текущим состоянием сервера или несовместим с другим запросом
  • 410 Gone - запрошенное содержимое было удалено с сервера, и отсутствует возможность переадресации. Ожидается, что клиенты удалят свои кеши и ссылки на этот ресурс
  • 411 Length Required - запрос отклонён, потому что сервер требует указание поля заголовка Content-Length, но оно не определено
  • 412 Precondition Failed - клиент указал в заголовках запроса условия, которым сервер не соответствует
  • 413 Payload Too Large - размер объекта запроса превышает ограничения, определенные сервером. Сервер может закрыть соединение или вернуть поле заголовка Retry-After. Веб-браузеры поддерживают запрос от 2 до 8 килобайт (неточно!)
  • 414 URI Too Long - запрошенный клиентом URI слишком длинный для того, чтобы сервер смог его обработать.
  • 418 I'm a teapot - «Шуточный» ответ: сервер отклоняет попытку заварить кофе, потому что он чайник. Первоапрельская шутка разработчиков, появившаяся в 1998 году. Не используется
  • 429 Too Many Requests - пользователь превысил лимит запросов в определённый промежуток времени. Код применяется, прежде всего, из соображений безопасности.

Причины и способы устранения клиентских ошибок

Чтобы понять чем может быть вызвана ошибка запроса, нужно удостовериться в том, что всё программное обеспечение имеет актуальную версию (выбран верный стенд для работы клиент + сервер), обновлен браузер. Может помочь просмотр логов (журналов сервера) для понимания процессов обработки запросов. Веб-серверы Apache и Nginx сохраняют файлы access.log и error.log.

Также следует понимать, что описание кодов ошибок HTTP - это часть стандарта, но код ответа сервера во многом определяется тем, как программное обеспечение обрабатывает ту или иную ошибку (может быть изменен программистом).

  • Ошибка 400 Bad Request:

    • Большое количество файлов cookies и данных в кэше. Как вариант - очистка кэша и файлов cookies
    • Неисправности в браузере. Как вариант - расширения браузера, реинсталл браузера
    • Неправильный HTTP-запрос из-за клиентской ошибки, например, при использовании curl
  • Ошибка 401 Unauthorized:
    Появляется, если клиент пытается получить доступ к ресурсу, который защищен HTTP-авторизацией. Будет появляться до тех пор, пока клиент не пройдет аутентификацию (введет верные логин и пароль). Он внесен в файл .htpasswd

  • Ошибка 403 Forbidden:
    Этот код состояния сообщает клиенту, что у клиента нет прав на чтение файла, который он запрашивает. То есть пользователь не прошел авторизацию - процесс проверки прав доступа пользователя к определенным ресурсам или функциям. Другая причина появления кода ошибки 403 — намеренное использование файла .htaccess для того, чтобы установить запрет определенным IP-адресам на доступ к ресурсам. Поэтому в случае получения такого кода ошибки нужно проверить настройки файла .htaccess

  • Ошибка 404 Not Found. Причин возникновения может быть много, основные:

    • Корректность написания ссылки URL
    • Существует вероятность, что запрашиваемый файл перемещен или удален из указанного места на сервере
    • Опять же, проблема с авторизацией и доступом к ресурсам
    • Некорректное расположение корневой (root) директории в конфигурации сервера
    • Cервер не поддерживает символические ссылки

Ошибки сервера (500 – 599)

500.jpg

Эти ошибки не относятся к пользовательским и возникают на стороне сервера, когда сервер не может обработать запрос клиента или осуществить запрашиваемое действие.

  • 500 Internal Server Error - на сервере произошла ошибка, в результате которой он не может успешно обработать запрос
  • 501 Not Implemented - метод запроса не поддерживается сервером и поэтому он не может быть обработан. Методы GET и HEAD должны всегда поддерживаться сервером и для них не должен возвращаться этот код.
  • 502 Bad Gateway - такой ответ может прислать сервер, который выступает в качестве шлюза, если в процессе обработки запроса он получил недопустимый ответ от целевого сервера (вышестоящего сервера). Основная причина — несогласованные протоколы сервера и посредника.
  • 503 Service Unavailable - сервер не готов обработать запрос в данный момент. Распространёнными причинами являются техническое обслуживание или перегрузка сервера. Клиенту рекомендуется отправить запрос позднее
  • 504 Gateway Timeout - такой ответ может прислать сервер, который выступает в качестве шлюза, если в процессе обработки запроса он не может получить ответ от целевого сервера в обозначенное в настройках время
  • 505 HTTP Version Not Supported - используемая в запросе версия HTTP не поддерживается сервером

Устранение серверных ошибок

  • Ошибка 500 Internal Server Error. Основные причины:

    • неправильные права доступа на папки и файлы, вызывающие невозможность запуска скрипта
    • неправильная инструкция в файле .htaccess или неподдерживаемые директивы приводят к данному HTTP-статусу в ответ на запрос клиента
  • Ошибка 502 Bad Gateway. Если это обратный прокси-сервер (балансировщик нагрузки) необходимо проверить:

    • backend сервера
    • верно ли настроен обратный прокси и правильны ли настройках
    • настройки сетевого соединения между серверами backend и обратным прокси-сервером
    • проверить порты и отсутствие блокировки брандмауэром
    • разрешения у сокетов и их корректность
  • Ошибка 504 Gateway Timeout. Основные причины:

    • проблемы с сетью, слабое интернет-соединение между шлюзом и основным сервером
    • перегрузка сервера-шлюза, большая нагрузка не позволяет быстро выполнить работу
    • в настройках сервера указан короткий период ожидания ответа от шлюза

Оригинал MDN - developer.mozilla.org

openImgPic