Перейти к содержанию

Коды состояния HTTP

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

Фразы причины здесь — из RFC, на английском, потому что это то, что передаётся по проводу — сервер отправляет "Not Found", а не его перевод, и фраза, которую вы ищите в журнале, должна соответствовать байтам, которые фактически были отправлены.

Различия, которые вызывают реальные проблемы, находятся внутри классов, а не между ними: 401 против 403, 301 против 308 и 502 против 503 каждый отвечает на другой вопрос о том, что делать дальше, и каждый регулярно используется для другого.

1xx — информационный

3

Предварительно: ответ не окончателен и потом следует другой.

КодФраза причиныЧто это означает
100ContinueЗаголовки получены, продолжайте отправлять тело.
101Switching ProtocolsПереключение протоколов — рукопожатие WebSocket.
103Early HintsРанние подсказки: предварительно загрузите эти ресурсы, пока готовится реальный ответ.

2xx — успех

5

Запрос был получен, понят и принят.

КодФраза причиныЧто это означает
200OKУспех, с телом.
201CreatedСоздано.Должна содержать заголовок Location, указывающий на новый ресурс.
202AcceptedПринято для обработки, которая ещё не произошла.
204No ContentУспех и намеренно никакого тела.Правильный ответ на DELETE или сохранение без возвращаемого значения.
206Partial ContentЧастичное содержание — ответ на запрос Range. Возобновляемые загрузки.

3xx — перенаправление

6

Ресурс находится где-то ещё, или ваша кэшированная копия по-прежнему хороша.

КодФраза причиныЧто это означает
301Moved PermanentlyПеремещено постоянно. Обновите свои ссылки; кэши могут хранить это вечно.
302FoundНайдено — временное перенаправление.Широко реализовано как переключение метода на GET, который 307 исправляет.
303See OtherСмотрите другое: получить результат с GET. Перенаправление после отправки формы POST.
304Not ModifiedНе изменено — ваша кэшированная копия актуальна. Отправлено без тела.
307Temporary RedirectВременное перенаправление, метод и тело сохранены.
308Permanent RedirectПостоянное перенаправление, метод и тело сохранены.

4xx — ошибка клиента

14

Запрос является проблемой. Повторение его без изменений снова не удастся.

КодФраза причиныЧто это означает
400Bad RequestСервер не может проанализировать запрос вообще.
401UnauthorizedНе аутентифицирован — сервер не знает, кто вы.Названный Unauthorized, но это означает неаутентифицированный. Должно включать WWW-Authenticate.
403ForbiddenАутентифицирован и всё ещё не разрешён. Лучшие учётные данные не помогут.
404Not FoundТакого ресурса нет, и сервер не скажет, был ли он когда-либо.
405Method Not AllowedНеправильный метод для этого URL.Должна список те, которые работают в заголовке Allow.
406Not AcceptableНичего не доступно в формате, который будет использовать ваш заголовок Accept.
409ConflictКонфликты с текущим состоянием — редактирование против устаревшей версии.
410GoneПропало: оно существовало и было намеренно удалено. Сильнее, чем 404.
413Content Too LargeТело больше, чем принимает сервер.
415Unsupported Media TypeСервер не обрабатывает это Content-Type.
418I'm a teapotЯ чайник. Шутка 1998 года 1 апреля, навсегда зарезервированная.
422Unprocessable ContentПравильно разобрано, содержимое недействительно — отсутствующее поле, плохое значение.
429Too Many RequestsОграничено по скорости.Ищите Retry-After перед повторной попыткой и экспоненциально отступите.
451Unavailable For Legal ReasonsЗаблокировано по правовым причинам. Число — кивок на Fahrenheit 451.

5xx — ошибка сервера

6

Запрос может быть в порядке. Это те, которые стоят повторной попытки.

КодФраза причиныЧто это означает
500Internal Server ErrorНеобработанная ошибка на сервере. Ничего не нужно исправлять на вашей стороне.
501Not ImplementedСервер не реализует этот метод вообще.
502Bad GatewayПрокси достиг вышестоящего сервера и получил что-то непригодное в ответ.
503Service UnavailableНамеренно не обслуживается — перегружен или на обслуживание.Статус, который должен содержать Retry-After.
504Gateway TimeoutПрокси дал отказал ожидать вышестоящего сервера.
505HTTP Version Not SupportedВерсия HTTP в запросе не поддерживается.

FAQ

В чём разница между 401 и 403?
401 Unauthorized означает, что запрос не был аутентифицирован — сервер не знает, кто вы, и правильный 401 включает заголовок WWW-Authenticate, который сообщает, как это доказать. 403 Forbidden означает, что он точно знает, кто вы, и вы всё равно не можете иметь это. Повторная попытка 403 с лучшими учётными данными для того же удостоверения не поможет.
Должен ли я использовать 301 или 308 для перенаправления?
308, если метод важен. Исторически 301 и 302 были широко реализованы как "перенаправить и переключиться на GET", что молча превращает POST в GET. 307 и 308 были введены, чтобы обещать сохранение метода и тела. Для постоянного перемещения страницы, которая никогда не получается, 301 остаётся лучшим понятным выбором.
Что означает 422, чего не означает 400?
400 Bad Request означает, что сервер вообще не может понять запрос — неправильный JSON, сломанный заголовок. 422 Unprocessable Content означает, что он хорошо разобран и содержимое неправильно: хорошо сформированное тело с отсутствующим обязательным полем или датой в прошлом. Раскол полезен именно потому, что исправление клиента различается в каждом случае.
Is 418 a real status code?
Это реально в том смысле, что оно зарегистрировано и каждая библиотека HTTP это знает, и это шутка в том, что оно происходит из 1998 апреля Дураков протокола управления кофейником с гипертекстом. Попытки вернуть номер в практическое использование были отклонены, поэтому он навсегда зарезервирован для чайников.
Почему 503 отличается от 502?
502 Bad Gateway означает, что прокси достиг вышестоящего сервера и получил что-то непригодное в ответ. 503 Service Unavailable означает, что сам сервер в настоящее время намеренно не обслуживает — перегружен или на обслуживание — и это тот, который должен содержать заголовок Retry-After, потому что это тот, который ожидается, что восстановится.