
Каждая ошибка 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_* или смешанное содержимое, сбивают с толку сильнее всего, потому что запрос не провалился, а не завершился. Какая бы у вас ни была, код называет категорию и умалчивает о случае, так что сохраните упавший запрос, пока он ещё у вас есть.