Любой ответ HTTP начинается с трёхзначного числа, и это число — максимально короткий способ, которым сервер сообщает, что случилось с вашим запросом. Обычно вы его не видите: страница загружается, браузер идёт дальше. Число становится заметным только тогда, когда что-то не так, то есть именно когда вам нужно знать, что оно означает.
Но коды состояния — не только диагностика, это инструкции. 301 говорит поисковой системе навсегда перенести запись в индексе; 429 сообщает клиенту, как именно замедлиться; 503 просит робота вернуться позже вместо того, чтобы выбросить вашу страницу. Вернуть неверный код — один из самых тихих способов потерять трафик, потому что внешне ничего не ломается. Это руководство разбирает каждый класс, коды, которые вы встретите на практике, и способы проверить, что URL возвращает в действительности.
Почему коды состояния важны
Ваши коды состояния читают четыре аудитории, и каждая реагирует по-своему:
- Браузеры. Они решают, следовать ли редиректу, использовать ли копию из кеша и отправлять ли тело формы повторно.
- Поисковые системы. Код решает, будет ли URL проиндексирован, склеен с другим, повторён позже или отброшен. Отдавать красивую страницу «не найдено» с кодом
200— классическая ошибка: роботу сообщают, что страница существует, и он держит её в индексе. - Клиенты API. Хорошо написанные клиенты ветвятся по коду.
429или503стоит повторить;400— никогда, потому что повтор некорректного запроса даст ту же ошибку. - Ваш собственный мониторинг. Доли ошибок и оповещения почти всегда строятся на кодах состояния, поэтому сервис, который возвращает
200с ошибкой в теле, невидим для своих же дашбордов.
Пять классов
Первая цифра говорит, чья это ответственность и что делать дальше. Если запомнить только одно, запомните эту таблицу.
| Класс | Значение | Что делать клиенту |
|---|---|---|
1xx | Информация: запрос получен, обработка продолжается | Ждать; встречается редко |
2xx | Успех: запрос получен, понят и принят | Использовать ответ |
3xx | Перенаправление: ресурс находится в другом месте | Следовать заголовку Location |
4xx | Ошибка клиента: запрос был неверным | Исправить запрос, не повторять слепо |
5xx | Ошибка сервера: запрос был верным, сервер не справился | Повторить с растущей паузой |
Разделение на 4xx и 5xx важнее всего на практике, потому что отвечает на единственный вопрос, который имеет значение во время инцидента: это мне исправлять или им?
Коды, которые вы действительно встретите
Зарегистрированных кодов десятки, но в рабочий день попадается, пожалуй, пятнадцать. Коды успеха самые простые. 200 OK — обычный ответ. 201 Created — правильный ответ на POST, который что-то создал, и он должен содержать заголовок Location с адресом нового ресурса. 204 No Content говорит, что запрос выполнен и возвращать намеренно нечего, — верный ответ на DELETE. 206 Partial Content — то, благодаря чему работают перемотка видео и возобновляемые загрузки.
Редиректы: 301, 302, 307 и 308
Редиректы наносят больше вреда SEO, чем любой другой класс, и почти всегда потому, что постоянную и временную формы путают местами.
301 Moved Permanently— адрес изменился окончательно. Поисковые системы переносят сигналы ранжирования на новый адрес и со временем заменяют старый в индексе. Используйте при переезде домена, переходе с HTTP на HTTPS, добавлении или удаленииwww.302 Found— временно. Старый URL остаётся в индексе, потому что вы сказали, что он вернётся. Используйте для A/B-тестов, коротких окон обслуживания и гео-маршрутизации, которую планируете отменить.307 Temporary Redirect— как302, но метод и тело гарантированно сохраняются.POST, перенаправленный через307, приходит какPOST; исторически некоторые клиенты превращали перенаправленныйPOSTвGET.308 Permanent Redirect— постоянный аналог307: та же семантика кеширования, что у301, с сохранением метода.304 Not Modified— на самом деле не редирект. Он отвечает на условный запрос и означает «ваша копия в кеше ещё годится»; именно поэтому хорошо настроенный сайт передаёт гораздо меньше данных, чем можно судить по весу страниц.
Два правила: не выстраивайте цепочки редиректов там, где достаточно одного перехода, потому что каждый переход стоит задержки и краулингового бюджета; и не перенаправляйте все отсутствующие страницы на главную. Второе выглядит аккуратно и сообщает и пользователям, и роботам неправду.
Ошибки клиента: 400, 401, 403, 404 и 429
Семейство 4xx говорит, что проблема была в самом запросе. Различия стоит соблюдать точно, потому что клиенты ведут себя по-разному в каждом случае.
400 Bad Request— некорректный синтаксис: сломанный JSON, отсутствующее обязательное поле, неразбираемый параметр. В таком виде повторять бессмысленно.401 Unauthorized— название обманчиво; он означает не аутентифицирован. Учётных данных нет либо сервер не смог их проверить. Должен содержать заголовокWWW-Authenticate.403 Forbidden— сервер знает, кто вы, и всё равно не разрешает. Повторная аутентификация не поможет.404 Not Found— по этому URL ничего нет. Сервер не говорит, было ли когда-нибудь.405 Method Not Allowed— URL существует, но не для этого метода. Добавьте заголовокAllowсо списком допустимых.409 Conflict— запрос конфликтует с текущим состоянием, например дублирующийся ключ или устаревшая версия.410 Gone— ресурс существовал и был удалён намеренно. Поисковые системы выбрасывают410быстрее, чем404, так что это лучший выбор, когда вы сознательно убрали контент.422 Unprocessable Content— синтаксис разобран, но значения не прошли проверку. Полезно, чтобы отделить «я не могу это прочитать» от «я прочитал, и это неверно».429 Too Many Requests— вы превысили лимит запросов. Всегда сопровождайте его заголовкомRetry-After; без него клиенты повторяют немедленно и усугубляют перегрузку.
Ошибки сервера: 500, 502, 503 и 504
5xx означает, что ваш запрос был разумным, а сервер всё равно не справился. Четыре распространённых кода указывают на разные уровни, и это делает их действительно полезными во время инцидента.
500 Internal Server Error— необработанное исключение в приложении. Общий код «на все случаи» и первое, что стоит искать в логах.502 Bad Gateway— прокси или балансировщик получил недопустимый или пустой ответ от бэкенда. Обычно приложение за прокси упало или не слушало порт.503 Service Unavailable— сервер перегружен или на обслуживании. Это единственный код семейства, который стоит возвращать намеренно, с заголовкомRetry-After, во время плановых работ: роботы сохраняют страницу и возвращаются.504 Gateway Timeout— прокси дождался предела и сдался. Указывает на медленную зависимость, а не на падение.
Во время сбоя разница между 502 и 504 подсказывает, умерло ваше приложение или просто замедлилось, и это часто самая быстрая доступная подсказка.
Коды состояния и SEO
Поисковые системы считают код состояния главным утверждением об URL и доверяют ему больше, чем чему угодно в теле страницы. Из этого следуют четыре вывода:
- «Мягкие 404» расходуют краулинговый бюджет. Сообщение «страница не найдена» с кодом
200держит мёртвый URL в индексе, где он конкурирует с реальными страницами. Возвращайте настоящий404или410. - Используйте
301для постоянных переездов.302при настоящем переезде оставляет старый URL в индексе и делит сигналы между двумя адресами. - Держите цепочки редиректов короткими. Каждый переход добавляет задержку, а роботы следуют лишь за ограниченным числом переходов. Направляйте старый URL прямо на конечный адрес.
- Во время обслуживания возвращайте
503.503сRetry-Afterпросит робота вернуться. Таймаут или500выглядят как сломанный сайт.
Редиректы связаны и с HTTPS. Если перенаправление с http:// на https:// настроено, но сертификат недействителен или просрочен, посетители увидят предупреждение браузера ещё до того, как редирект станет важен, поэтому стоит заодно проверить сертификат с помощью проверки SSL-сертификата.
Как проверить код состояния
При успешной загрузке браузер скрывает код, так что его нужно запросить явно. Три надёжных способа:
- Панель «Сеть» в браузере. Откройте инструменты разработчика, перезагрузите страницу и прочитайте столбец статуса. Там видна вся цепочка редиректов, чего одно число показать не может.
curl -I https://example.com. ЗапросHEADвыводит строку статуса и заголовки, не загружая тело. Добавьте-L, чтобы пройти по редиректам и увидеть каждый переход.- Справочник с поиском. Когда число у вас есть, а нужны значение, обязательства и типичные причины, наш справочник кодов состояния HTTP перечисляет каждый код и что с ним делать.
Кроме самого числа стоит проверить две вещи. Во-первых, тестируйте именно тот URL, на который попадёт пользователь, со слешем на конце или без него, потому что они часто разрешаются по-разному. Во-вторых, если ответ — 429, прочитайте значение Retry-After и выясните, действительно ли ваш клиент его соблюдает; калькулятор лимита запросов превращает лимит в конкретные интервалы.
Типичные ошибки
- Возвращать
200с ошибкой в теле. Мониторинг, кеши, роботы и клиенты читают код, а не ваш JSON. Самая дорогая ошибка в списке. - Использовать
302для постоянного переезда. Сигналы ранжирования остаются на старом URL, иногда месяцами. - Перенаправлять все 404 на главную. Это скрывает от вас битые ссылки и создаёт «мягкие 404» для роботов.
403там, где нужен401. Клиент, получивший403, не будет пытаться аутентифицироваться, потому что403говорит, что дело не в аутентификации.429безRetry-After. Тогда клиенты угадывают, обычно «немедленно», — именно то поведение, ради предотвращения которого и существует лимит.- Отдавать во время обслуживания таймаут. Возвращайте
503сRetry-After, чтобы сохранить записи в индексе. - Длинные цепочки редиректов после миграции. Каждая миграция добавляет переход; сверните их в один, когда в следующий раз будете править правила.
Проверьте свои коды состояния
Коды состояния — самая дешёвая диагностика в интернете: одно число, никакой аутентификации и однозначный ответ, работает ли URL, переехал или упал. Начните с того, что возвращают ваши важные страницы, убедитесь, что редиректы постоянные там, где должны быть, и временные там, где нужно, и проследите, чтобы каждый путь ошибки возвращал код, соответствующий тому, что действительно произошло.
Связанные инструменты и руководства:
- Коды состояния HTTP — справочник с поиском по всем кодам ответа.
- Калькулятор лимита запросов — превращает лимит в безопасные интервалы и
Retry-After. - DNS-запрос — убедитесь, что домен разрешается, прежде чем отлаживать его ответы.
- Проверка SSL-сертификата — проверьте сертификат за вашим редиректом на HTTPS.
- Редиректы 301 и 302: что выбрать и что видит SEO - какой редирект выбрать и как каждый влияет на позиции в поиске.
- 404 или 410: что каждый код говорит Google об удалённой странице - что каждый код сообщает Google об удалённой странице.
Частые вопросы
Почему 302 при постоянном переезде стоит мне позиций?⌄
Потому что 302 сообщает поисковым системам, что старый URL вернётся, и они держат его в индексе, оставляя на нём сигналы ранжирования. Новый URL тогда конкурирует со старым вместо того, чтобы наследовать от него, и это разделение может держаться месяцами. 301 — это указание перенести запись в индексе и передать эти сигналы, а именно это и нужно постоянному переезду.
Сколько переходов в цепочке редиректов — это слишком много?⌄
Один — цель, два терпимы; дальше вы платите задержкой на каждом визите и расходуете краулинговый бюджет, который мог уйти на реальные страницы. Роботы следуют лишь за ограниченным числом переходов, прежде чем сдаться, поэтому цепочка, наросшая за несколько миграций, способна сделать конечную страницу недостижимой. В следующий раз, правя правила, направьте каждый старый URL прямо на конечный адрес.
Что должен возвращать API, когда клиент достиг лимита запросов?⌄
429 Too Many Requests с заголовком Retry-After, указывающим число секунд ожидания. Если вместо этого вернуть 403 или 500, клиенты лишаются способа вести себя правильно: они повторяют немедленно и усугубляют перегрузку. Калькулятор лимита запросов сам подберёт разумный интервал и значение Retry-After.
Как понять, сбой в моём приложении или в медленной зависимости?⌄
Прочитайте код, который возвращает прокси. 502 означает, что он получил недопустимый или пустой ответ от бэкенда, то есть приложение за ним упало или не слушало порт. 504 означает, что он ждал бэкенд и сдался, и это указывает на что-то медленное, а не мёртвое. Эта одна цифра часто оказывается самой быстрой подсказкой во время инцидента.
Почему 401 называется Unauthorized, если означает «не аутентифицирован»?⌄
Это случайность в наименовании из исходной спецификации, которую так и не исправили. На практике 401 означает, что в запросе не было учётных данных либо сервер не смог их проверить, и он должен содержать заголовок WWW-Authenticate. 403 Forbidden — код для запроса, который успешно аутентифицирован, но всё равно не разрешён.
Как увидеть код состояния страницы в браузере?⌄
Откройте инструменты разработчика, перейдите на панель «Сеть», перезагрузите страницу и прочитайте столбец статуса для основного документа. Там же видна каждая ступень цепочки редиректов, чего один код показать не может. В терминале curl -I выводит строку статуса без загрузки тела, а ключ -L заставляет пройти по редиректам.
Более 15 лет практического опыта в веб-разработке и безопасности. Специализация — практическая веб-безопасность: чтобы сайты были защищёнными, надёжными и легко диагностировались. BuildToolForge создан, чтобы такие проверки были бесплатными, приватными и понятными. Инструменты по возможности работают прямо в браузере, а всё, что вы вводите в инструмент, не сохраняется.
Как мы пишем руководства: Каждое руководство основано на практическом опыте, сверено с официальными стандартами и проверено нашими инструментами на реальных доменах. Мы обновляем руководства, когда меняются стандарты или инструменты. Нашли ошибку? Напишите нам: contact@buildtoolforge.com.