Каждая ошибка HTTP - это однострочный ответ на вопрос, который никто не задавал вслух: что случилось с моим запросом? Число и есть весь ответ, и оно нарочно скупо, так что почти вся работа сводится к тому, чтобы знать, на какой вопрос отвечает каждое число.

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

Единственное разделение, которое важно

Первая цифра - единственная часть кода, которую нужно помнить.

4xx
Сервер вас понял и отказывает, либо не смог разобрать пришедшее. Проблема в запросе
5xx
С запросом всё было в порядке. Сервер не смог выдать ответ или предпочёл этого не делать

Всё остальное следует отсюда. Код 4xx отправляет вас смотреть на отправленное: адрес, заголовки, тело, учётные данные. Код 5xx отправляет вас в журналы сервера, а если сервер не ваш, сделать можно немногим больше, чем хорошо сообщить о проблеме.

Слово “клиент” в “ошибке клиента” - это место, где люди теряют нить, поэтому скажем прямо: клиент - это не вы. Клиент - это та программа, которая составила запрос, а на современном сайте это почти всегда JavaScript самой страницы. Ошибка 4xx на чужом сайте обычно означает их баг с вашим именем на нём.

Коды 4xx, которые вам действительно встретятся

400 Bad Request - это сервер, вообще не сумевший разобрать пришедшее. Единственный в этом семействе, который говорит о форме запроса, а не о правах или существовании. Испорченное тело, отсутствующий content type, неэкранированный адрес. Есть ровно одна разновидность, которую вы можете исправить сами: разросшийся блок куки, что приватное окно подтверждает за секунды.

401 и 403 - те два, которые постоянно меняют местами. 401 означает, что сервер не знает, кто вы, и хочет учётные данные. 403 означает, что он точно знает, кто вы, и ответ всё равно нет. Более удачные учётные данные исправляют первое и никогда не исправляют второе.

404 Not Found не нуждается в объяснении, но одно знать стоит: ошибка 404 на запрос, который страница сделала в фоне, а не в адресной строке, обычно означает, что сборка или выкатка потеряла файл, а не что кто-то ошибся при наборе.

429 Too Many Requests - единственный код состояния о вашем поведении, а не о сервере или ресурсе. Ещё это единственная ошибка, при которой повтор делает хуже, потому что повтор - это ещё один запрос, который ограничитель посчитает.

Коды 5xx, которые выглядят одинаково и означают разное

Все четыре говорят “это у нас”, и умение их различать решает, куда посмотрят первым делом.

500 Internal Server Error
Приложение выполнялось, и его собственный код не сработал. Необработанное исключение. Оно ответило, и ответом была ошибка, которую оно сделало само
502 Bad Gateway
Фронтальный сервер получил непригодный ответ от приложения позади него. Сбой между двумя серверами
503 Service Unavailable
Нечто решило вас не обслуживать. Обслуживание, ёмкость, ограничитель частоты или отсутствие здоровых целей
504 Gateway Timeout
Приложение так и не ответило вовремя. Фронтальный сервер перестал ждать

Полезная короткая версия: ошибка 500 - это код, ломающийся на ходу, 502 - прокси, не получивший хорошего ответа, 504 - слишком медленное приложение, а 503 - единственная, которая обычно возникает намеренно. Это последнее различие важнее, чем кажется: ошибка 503 часто несёт заголовок Retry-After, который говорит точно, когда вернуться, и почти никто его не читает.

Ошибки, которые вообще не коды состояния

Некоторые из самых частых сбоев никогда не порождают кода состояния, и именно поэтому они сбивают с толку. Запрос не провалился; он просто не завершился.

TypeError: Failed to fetch - самая неинформативная ошибка JavaScript. Читать состояние нечего, потому что запрос не дошёл до того, чтобы его иметь.

Ошибки CORS - это браузер, отказывающийся отдать вашему коду ответ, который на самом деле пришёл. Сервер ответил прекрасно; он просто не сказал, что ваше происхождение разрешено.

ERR_CONNECTION_REFUSED, RESET, CLOSED и TIMED_OUT происходят целиком ниже HTTP. Каждая называет, как далеко зашло соединение, прежде чем умереть, и это большая часть диагноза даром.

Смешанное содержимое - это браузер, блокирующий небезопасный ресурс на безопасной странице. В сети вообще ничего не сломалось; было применено правило.

Как прочитать чужую ошибку

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

Перезагрузите один раз. Изрядная часть ошибок 500 и 503 - это один неудачный момент. Если прошло, гнаться не за чем.

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

Попробуйте другую сеть. Телефон на мобильном интернете отвечает на вопрос, который поднимает ограничитель частоты. Если ошибка ходит за вами повсюду - дело в вашем аккаунте или в сайте; если она исчезает, дело было в адресе, с которого вы приходили. Это тот же вопрос, что и отличить свой баг от их аварии, заданный быстро.

Почему одного кода редко хватает, чтобы что-то починить

Каждая ошибка выше - это сводка, из которой убрали улики. Это не случайность: ошибка 500 расплывчата намеренно, потому что трассировка остаётся на сервере, а ошибка 400 не скажет вам, какой заголовок её задел. Код называет категорию и умалчивает о случае.

Поэтому “у меня была 500” - это сообщение, которое почти ничего не говорит разработчику, а к тому моменту, когда кто-то начинает разбираться, упавшего запроса уже нет. Быстро закрывает такую ошибку сам упавший запрос, его точное время и то, что человек в тот момент делал.

Session Replay

Бесплатное расширение Chrome. Один клик на странице, которая ведёт себя неправильно, захватывает снимок экрана, консоль и сетевой журнал, и даёт вам ссылку для вставки в задачу.

Получить расширение

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

В одном абзаце

Первая цифра - то самое разделение, которое важно: 4xx означает, что проблема в запросе, 5xx - что сервер не сумел ответить, а обвиняемый кодом 4xx “клиент” - это обычно JavaScript самого сайта, а не вы. Внутри 4xx ошибка 400 о форме запроса, 401 и 403 о личности против прав, а 429 о том, как часто вы спрашивали. Внутри 5xx ошибка 500 - это ломающийся код, 502 - прокси с плохим ответом, 504 - отсутствие своевременного ответа, а 503 - единственная, которая обычно является решением. Ошибки вовсе без кода состояния, такие как failed to fetch, CORS, ERR_CONNECTION_* или смешанное содержимое, сбивают с толку сильнее всего, потому что запрос не провалился, а не завершился. Какая бы у вас ни была, код называет категорию и умалчивает о случае, так что сохраните упавший запрос, пока он ещё у вас есть.