3.3. Коды статусов HTTP и что с ними делать

Поговорим об ответах сервера на запрос клиента. Допустим, вы реализовываете загрузку файла пользователем на странице и затем проверяете результат. Сервер может в ответ:

  • отправить этот файл, то есть запрос прошёл успешно;
  • не отправить, то есть запрос прошёл неуспешно.

И вместе с результатом выдать трёхзначный код, например:

404 Not found

Эти цифры и называются кодами состояния HTTP (англ. HTTP status code). Они варьируются от информационных и успешных до редиректов и кодов ошибок. Каждый код состояния отмечен числовым идентификатором в диапазоне от 100 до 599. По этому ответу вы можете понять, что произошло и как решить проблему. Давайте углубимся в значения идентификаторов.

За кодом ответа часто следует фраза на английском языке, которая указывает причину ответа.

Коды сгруппированы в пять классов:

  • Коды состояния HTTP 1xx — информационные ответы. Они указывают на то, что ваш веб-браузер сделал запрос на сервер и ожидает ответа.
  • Коды состояния HTTP 2xx — успешные ответы. Эти коды состояния сообщают клиенту, то есть веб-браузеру, что всё обрабатывается должным образом.
  • Коды состояния HTTP 3xx — перенаправления. Запрос получен, но для его выполнения нужен дополнительный шаг.
  • Коды состояния HTTP 4xx — ошибки на стороне клиента. Клиент сделал запрос, но целевая страница неверна.
  • Коды состояния HTTP 5xx — ошибки на стороне сервера. Запрос клиента был правильным, но сервер не смог его доставить.

Чтобы было проще понять эту тему, перейдём к бытовой ситуации: вы просите папу передать соль. Ответами могут быть:

100 — соль есть;
200 — держи;
300 — попроси маму;
404 — соль не найдена;
500 — я занят.

Как узнать код статуса? В инструментах разработчика во вкладке Network:

Как узнать код статуса в инструментах разработчика

Знать всё не нужно, достаточно запомнить только самые распространённые статусы. Остальные при необходимости можно найти здесь: «Все HTTP-статусы».

Ниже находится памятка — наиболее распространённые коды статуса HTTP, с которыми сталкиваются разработчики.

Коды первой сотни — служебные, поэтому очень редко встречаются в работе.

200 — ОК

Запрос клиента выполнен успешно.

201 — Создан

Запрос клиента выполнен успешно, и был создан новый ресурс. Это обычный ответ для метода POST и иногда для метода PUT.

204 — Нет содержимого

Действие выполнено успешно, но содержимое не возвращено. Полезно для действий, для которых не требуется тело ответа, например для DELETE. То есть если вы использовали DELETE, то тело ответа не нужно, значит, всё верно.

301 — Переехал навсегда

Ресурс перемещён в другое место, и местоположение известно. Этот заголовок особенно полезен, когда URL-адреса меняются с течением времени: из-за изменения версии, миграции или какого-либо другого изменения.

Решение: сохранение старых ссылок и перенаправление на новые URL.

302 — Переехал временно

Запрашиваемый документ был найден и расположен временно по другому адресу.

304 — Не изменён

Запрошенный ресурс не был изменён. Чаще всего используется для кеширования, то есть можно не загружать ресурс заново. Полезно использовать для высоконагруженных проектов.

Как это сделать? Возьмём для примера сайт http://example.com. Посмотрим код ответа на загружаемые ресурсы в инструментах разработчика во вкладке Network > Headers:

Прокрутим ниже до Etag — это хеш ресурса:

В данном случае его значение 3147526947+gzip. Мы можем указать, что если хеш при загрузке такой же, то загружать ресурс ещё раз не надо. Заголовок HTTP-запроса If-None-Match делает запрос условным. Введём этот код в консоли:

fetch("http://example.com", {"headers": {"If-None-Match": "3147526947+gzip"}}).then(a => {console.log(a); return a.text()}).then(console.log)

If-None-Match

И проверим код статуса:

Теперь код статуса 304, и ресурс повторно не загрузился.

400 — Неверный запрос

В отправленном запросе есть проблемы, например, могут отсутствовать некоторые обязательные параметры. Часто к ответу 400 добавлено сообщение об ошибке, которое вы можете использовать для исправления запроса.

401 — Несанкционированный

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

Решение: перенаправить пользователя на авторизацию.

403 — Запрещено

Клиенту отказано в доступе к запрошенному ресурсу из-за отсутствия у клиента необходимых разрешений.

Причины и решения:

  1. Нет разрешения на доступ. Решение: открыть доступ на чтение.
  2. Настройки .htaccess-файла запрещают использование, например, IP-адреса или диапазона IP-адресов. Решение: проверьте настройки .htaccess-файла.
  3. Нет индексного файла, а списки каталогов не включены. Решение: включите списки каталогов на веб-сервере.

404 — Не найдено

Предоставленный URL-адрес не идентифицирует какой-либо ресурс. Хорошее решение к этому ответу — вывод других URL-адресов, которые клиент может использовать, чтобы продолжить пользование веб-приложение. Это может быть корневой URL, предыдущий использованный URL или другие.

405 — Метод запрещён

Используемый метод HTTP не разрешён для конкретного ресурса. Например, выполнение PUT для ресурса с правами только для чтения.

Решение: поменять метод.

411 — Необходимо указание длины

Означает, что нужно указать Content-Length. Такое бывает, если на сервере есть ограничение на объём. Таким образом, сервер не будет загружать ресурс с превышающим его возможности объёмом.

Решение: указать Content-Length.

414 — Слишком длинный URL

Указывает, что URI, запрошенный клиентом, длиннее, чем сервер готов обработать. Такое может произойти, когда длинные параметры передаются через метод GET, а не POST.

Решение: изменить метод, сократить длину параметров или увеличить разрешённую длину.

415 — Данный тип медиа не поддерживается

Сервер отказывается принимать запрос, поскольку формат данных не поддерживается.

Решение: передать задачу бэкенд-разработчику, чтобы он проверил конфигурации сервера.

500 — Внутренняя ошибка сервера

Общий код ошибки, когда возникает непредвиденное условие и происходит сбой сервера. Обычно этот ответ сопровождается сообщением об ошибке, объясняющим, что пошло не так. Часто происходит из-за отсутствия пакетов (например, при попытке выполнить файл PHP без правильной установки PHP) или неправильной конфигурация сервера (например, .htaccess-файла).

503 — Сервис недоступен

Запрос не выполнен из-за проблем с сервером. Чаще всего такое происходит, когда сервер перезагружается или находится на обслуживании. Также код появляется, когда серверу не хватает ресурсов или памяти.

Решение: передать задачу бэкенд-разработчику, чтобы веб-сервер мог обрабатывать больше потоков, пользователей или процессов, либо обратиться к сисадмину для изменения настроек сервера.

507 — Не хватает места

Серверу не хватает места для выполнения запроса.

Решение: увеличить место на веб-сервере.

Вывод

Приведённый выше список кодов состояния HTTP не является полным. Мы охватили лишь небольшую часть — которые чаще встречаются в практике. Полный список статусов HTTP можно найти здесь: «Все HTTP-статусы».