Полный технический гайд по HTTP-кодам с примерами
Содержание
- Актуальность
- Значение кодов состояния HTTP
- Влияние на клиентов, серверы, поисковые системы и кэширующие слои
- Особенности проектирования API
- Оптимизация производительности
- Надёжность и мониторинг
- Аспекты безопасности
- Влияние на SEO
- Таблица HTTP-кодов с цветовой индикацией
- Легенда
- 🟦 1xx Информационные
- 🟩 2xx Успех
- 🟨 3xx Перенаправления
- 🟥 4xx Ошибки клиента
- ⬛ 5xx Ошибки сервера
Актуальность
Коды состояния HTTP — это фундаментальные сигналы в работе веб-систем, которые напрямую определяют поведение клиентов, серверов, поисковиков и кэширующих слоёв. Их грамотное применение способно улучшить производительность, надёжность и SEO, при этом снизив инфраструктурные издержки.
В проектировании API правильный выбор кода может кардинально изменить работу клиента. Например, редирект POST с помощью 302 Found
может превратить его в GET и нарушить логику оплаты. Использование 308 Permanent Redirect
в такой ситуации сохранит метод и обеспечит безопасность транзакций.
Оптимизация производительности также невозможна без статусов. 304 Not Modified
позволяет браузеру не загружать заново неизменённые ресурсы, что сокращает время загрузки на 30–40% для тяжёлых сайтов (пример — GitHub Pages). А 206 Partial Content
используется Netflix для отдачи только нужных сегментов видео, а не целого файла.
С точки зрения надёжности и мониторинга, статусы определяют уровень критичности инцидента и поведение автоскейлинга. Ошибочная классификация клиентских ошибок (4xx
) как серверных (5xx
) может вызвать ненужное масштабирование и рост затрат, не устранив корень проблемы.
Статусы — это и инструменты безопасности. Чёткое разделение 401 Unauthorized
и 403 Forbidden
помогает избежать утечек информации о существовании ресурсов (рекомендация OWASP). Коды 407 Proxy Authentication Required
и 511 Network Authentication Required
применяются для принудительной авторизации в сети.
Наконец, SEO напрямую зависит от корректного выбора кодов. 301 Moved Permanently
передаёт ссылочный вес новому URL, а 302 Found
сообщает поисковику о временном переносе. Код 410 Gone
ускоряет деиндексацию страниц, что важно при удалении запрещённого контента.
Таким образом, правильное использование кодов HTTP — это инструмент с минимальными затратами и максимальным эффектом: он усиливает наблюдаемость, улучшает UX, повышает SEO и оптимизирует производительность.
Таблица HTTP-кодов с цветовой индикацией
Легенда: 🟦 1xx Информационные, 🟩 2xx Успех, 🟨 3xx Перенаправления, 🟥 4xx Ошибки клиента, ⬛ 5xx Ошибки сервера
Цвет | Код | Назначение | Пример в продакшене |
---|---|---|---|
🟦 | 100 Continue | Сервер подтвердил заголовки; можно отправлять тело. | Большой PUT с Expect: 100-continue в S3, чтобы не слать отклоняемый payload. |
🟦 | 101 Switching Protocols | Сервер согласился сменить протокол. | Апгрейд HTTP/1.1 до WebSocket для realtime-чата. |
🟦 | 102 Processing | Запрос принят; обработка не завершена (WebDAV). | Длительная многофайловая операция без таймаута клиента. |
🟦 | 103 Early Hints | Хинты предзагрузки до финального ответа. | Link: rel=preload для CSS/JS, ускорение LCP. |
🟩 | 200 OK | Успех с телом ответа. | GET /users/1 возвращает JSON-документ. |
🟩 | 201 Created | Ресурс создан; Location с URI обязателен. | POST /orders → Location: /orders/12345. |
🟩 | 202 Accepted | Принято к асинхронной обработке. | Постановка задачи кодирования видео в очередь. |
🟩 | 204 No Content | Успех без тела. | DELETE /files/42 подтверждает удаление. |
🟩 | 206 Partial Content | Частичный ответ по Range. | Байтовые диапазоны для MP4-потока. |
🟩 | 207 Multi-Status | Несколько статусов (WebDAV). | Batch-операции: часть успешна, часть нет. |
🟩 | 208 Already Reported | Ресурс уже был передан. | WebDAV исключает дубли. |
🟩 | 226 IM Used | Применено дельта-кодирование. | Endpoint синхронизации отдаёт только изменения. |
🟨 | 300 Multiple Choices | Доступно несколько представлений. | Страница выбора языка или формата. |
🟨 | 301 Moved Permanently | Перенос навсегда; обновление SEO-сигналов. | Миграция http:// → https:// с консолидацией. |
🟨 | 302 Found | Временный редирект; канонический URL прежний. | Кампания с A/B лендингом. |
🟨 | 303 See Other | После POST перейти на GET-ресурс. | POST /checkout → GET /orders/123/status. |
🟨 | 304 Not Modified | Кэш клиента актуален; тела нет. | Попадание по ETag/If-None-Match. |
🟨 | 307 Temporary Redirect | Временно; метод сохраняется. | Перенос POST-трафика в резервный регион на время работ. |
🟨 | 308 Permanent Redirect | Навсегда; метод сохраняется. | Принудительный HTTPS или новый хост без смены метода. |
🟥 | 400 Bad Request | Неверный синтаксис или валидация. | Битый JSON или нарушение схемы. |
🟥 | 401 Unauthorized | Нет или просрочена аутентификация. | Истёкший JWT для защищённого ресурса. |
🟥 | 402 Payment Required | Монетизированный доступ. | Платный тариф API блокирует бесплатный запрос. |
🟥 | 403 Forbidden | Аутентифицирован, но прав не хватает. | Не-админ пытается открыть /admin/users. |
🟥 | 404 Not Found | Ресурс отсутствует. | Неизвестный slug /posts/does-not-exist. |
🟥 | 405 Method Not Allowed | Метод не поддерживается. | PUT на эндпоинте только для GET. |
🟥 | 406 Not Acceptable | Нет представления под Accept. | Клиент требует только image/avif. |
🟥 | 407 Proxy Authentication Required | Прокси требует входа. | Корпоративный прокси блокирует исходящий трафик. |
🟥 | 408 Request Timeout | Клиент слишком долго формировал запрос. | API-шлюз закрывает простаивающую загрузку через 30 секунд. |
🟥 | 409 Conflict | Конфликт состояния ресурса. | Несовпадение ETag при оптимистичной блокировке. |
🟥 | 410 Gone | Ресурс удалён намеренно; не восстанавливать. | Удалённая статья для деиндексации. |
🟥 | 411 Length Required | Нужен Content-Length. | Легаси-апстрим принимает только фиксированную длину. |
🟥 | 412 Precondition Failed | Нарушена предусловие If-*. | Обновление отклонено из-за устаревшего ETag. |
🟥 | 413 Payload Too Large | Тело превышает лимит. | 200 МБ загрузка при лимите 50 МБ. |
🟥 | 414 URI Too Long | Слишком длинный URI. | Огромная query-строка из клиентского приложения. |
🟥 | 415 Unsupported Media Type | Неподдерживаемый Content-Type. | text/plain отправлен в JSON-API. |
🟥 | 416 Range Not Satisfiable | Неверный байтовый диапазон. | Начало диапазона за пределами размера файла. |
🟥 | 417 Expectation Failed | Требование Expect не поддержано. | Сервер не реализует ожидаемое поведение. |
🟥 | 418 Я — чайник | Тестовый статус RFC 2324. | Staging-хелсчек возвращает 418. |
🟥 | 421 Misdirected Request | Запрос ошибочно направлен другому origin. | Ошибка SNI в мульти-тенант CDN. |
🟥 | 422 Unprocessable Content | Семантически неверное тело. | Синтаксис ок, но нарушены бизнес-правила. |
🟥 | 423 Locked | Ресурс заблокирован (WebDAV). | Файл “checked-out” другим пользователем. |
🟥 | 424 Failed Dependency | Сбой из-за зависимой операции (WebDAV). | Неуспех родителя ломает дочерний PROPPATCH. |
🟥 | 425 Too Early | Рано обрабатывать; риск повторов. | Митигация 0-RTT в HTTP/2. |
🟥 | 426 Upgrade Required | Требуется другой протокол. | Принудительный HTTP/2 или HTTP/3. |
🟥 | 428 Precondition Required | Обязательны предусловия. | Запись требует If-Match для конкуррентности. |
🟥 | 429 Too Many Requests | Превышен лимит запросов. | Троттлинг 100 запросов в минуту на токен. |
🟥 | 431 Request Header Fields Too Large | Заголовки слишком большие. | Куки превышают лимит прокси. |
🟥 | 451 Unavailable For Legal Reasons | Блокировка по требованию закона. | Судебный запрет или геоблок. |
⬛ | 500 Internal Server Error | Общая ошибка сервера. | Необработанное исключение с incident ID. |
⬛ | 501 Not Implemented | Метод не реализован. | API не поддерживает PATCH. |
⬛ | 502 Bad Gateway | Некорректный ответ апстрима. | Nginx получает 5xx от бэкенда или сбой TLS. |
⬛ | 503 Service Unavailable | Перегрузка или техработы. | Автомасштабирование; очередь ограничивает трафик. |
⬛ | 504 Gateway Timeout | Таймаут апстрима. | Шлюз ждёт 60 секунд ответа от БД или сервиса. |
⬛ | 505 HTTP Version Not Supported | Версия HTTP не поддерживается. | Клиент шлёт HTTP/0.9 на HTTP/1.1 сервер. |
⬛ | 506 Variant Also Negotiates | Ошибка content negotiation. | Петля из-за неверного Alternates. |
⬛ | 507 Insufficient Storage | Недостаточно места (WebDAV). | Превышена квота ФС на WebDAV-шаре. |
⬛ | 508 Loop Detected | Обнаружен бесконечный цикл (WebDAV). | Циклическая привязка коллекции. |
⬛ | 510 Not Extended | Требуются расширения. | Операция требует проприетарного расширения. |
⬛ | 511 Network Authentication Required | Нужен вход в сеть. | Captive portal блокирует HTTP до авторизации. |