Ошибка 400 Bad Request: почему сервер отклоняет запрос
Что означает HTTP 400 Bad Request, какие ошибки запроса вызывают этот код и как по шагам проверить URL, заголовки, cookies, JSON, proxy и логи сервера.

HTTP 400 Bad Request означает, что сервер не может или не хочет обработать запрос из-за ошибки, которую считает ошибкой клиента. RFC 9110 приводит типичные классы причин: некорректный синтаксис запроса, неправильное framing сообщения или подозрительную маршрутизацию запроса.
На практике 400 не означает автоматически «сломался браузер». Ответ может сформировать CDN, reverse proxy, web-server, API gateway или само приложение. Поэтому полезная диагностика начинается с двух вопросов: какой именно запрос получает 400 и какой компонент его отклоняет.
Что означает HTTP 400
Упрощённая цепочка выглядит так:
клиент → CDN / WAF → reverse proxy → приложение
↓ ↓ ↓
400 400 400
Одинаковый код может возникнуть на разных уровнях. Например, proxy способен отвергнуть слишком большой или синтаксически некорректный набор заголовков ещё до передачи запроса приложению. API, напротив, может принять HTTP-сообщение, распарсить его и вернуть 400 из-за неправильного формата входных данных.

Поэтому текст страницы ошибки полезен, но решающими остаются фактический HTTP-ответ и логи того компонента, который его сформировал.
Чем 400 отличается от соседних 4xx
| Код | Типичный смысл |
|---|---|
400 Bad Request | запрос считается некорректным в целом |
401 Unauthorized | не хватает действительных данных аутентификации |
403 Forbidden | запрос понятен, но сервер отказывается его выполнять |
404 Not Found | целевой ресурс не найден или сервер не раскрывает его существование |
405 Method Not Allowed | ресурс существует, но HTTP-метод для него не разрешён |
413 Content Too Large | тело запроса превышает допустимый размер |
414 URI Too Long | URI слишком длинный |
415 Unsupported Media Type | формат содержимого не поддерживается |
Если приложение использует 400 для всех ошибок валидации, это допустимо как часть его API-контракта, но при диагностике важно читать тело ответа и документацию конкретного endpoint.
Основные причины 400 Bad Request
Ошибка в URL
Проверьте:
- опечатки в path;
- неправильное URL-кодирование;
- лишние или повреждённые escape-последовательности;
- неожиданно длинную query string;
- параметры, которые приложение не умеет разбирать.
Для ручной проверки сначала скопируйте URL без изменений и выполните:
curl -i 'https://example.com/path?key=value'
Кавычки важны: без них shell может интерпретировать &, ?, * и другие символы не так, как вы ожидаете.
Некорректные или слишком большие заголовки
Большие cookies, повторяющиеся заголовки или неверный Host могут привести к отклонению запроса на уровне proxy/web-server.
Полезно сравнить запрос браузера и минимальный запрос curl:
curl -i https://example.com/
Если curl получает 200, а браузер стабильно 400, одна из первых гипотез — различие в cookies, расширениях, proxy-настройках или заголовках браузера.
Повреждённые cookies
Большой или устаревший cookie-набор способен влиять на размер и содержимое заголовка Cookie.
Для проверки не обязательно сразу очищать все данные браузера. Сначала можно открыть приватное окно или отправить запрос без сохранённых cookies через curl. Если проблема исчезает, сравните запросы и найдите конкретное различие.
Невалидный JSON
Для API типичный сценарий:
{
"name": "Иван",
"enabled": true,
}
Лишняя запятая делает JSON невалидным. Сервер, который ожидает JSON, может вернуть 400.
Проверка:
curl -i \
-X POST \
-H 'Content-Type: application/json' \
--data '{"name":"Иван","enabled":true}' \
https://api.example.com/v1/items
Смотрите одновременно на HTTP-код и тело ответа: качественный API обычно сообщает, какое поле или часть запроса не удалось разобрать, если это безопасно раскрывать клиенту.
Неправильный Content-Type
Если отправляется JSON, а клиент сообщает другой media type, сервер может интерпретировать тело не тем parser. В зависимости от реализации это может закончиться 400 или более специфичным 415 Unsupported Media Type.
Проблема с Host или маршрутизацией
В HTTP/1.1 значение Host участвует в выборе virtual host. Некорректный host, конфликтующая proxy-конфигурация или защитное правило против подмены host способны завершиться 400 до приложения.
Некорректное тело формы или multipart-запроса
При ручной сборке multipart-запросов частая ошибка — самостоятельно задавать Content-Type: multipart/form-data без правильного boundary. Если curl формирует multipart через -F, boundary лучше доверить ему:
curl -i \
-F 'file=@report.pdf' \
https://example.com/upload
Шаг 1. Подтвердите настоящий статус
curl -i https://example.com/problem-url
Смотрите:
- первую строку ответа;
Server;- CDN/WAF-заголовки;
- request ID;
- тело ошибки.
Если браузер показывает собственную страницу, curl помогает отделить UI браузера от реального ответа сервера.
Шаг 2. Сведите запрос к минимальному
Начните с простого варианта:
curl -i https://example.com/api/items
Затем по одному добавляйте:
- HTTP-метод;
- query params;
- заголовки;
- авторизацию;
- body.

Так быстрее определить, после какого элемента появляется 400.
Шаг 3. Сравните рабочий и нерабочий запрос
Если один клиент работает, а другой нет, сравните:
метод
URL
Host
Content-Type
Authorization
Cookie
Content-Length
body
Не публикуйте Authorization, session cookies и другие секреты в тикете или общем чате.
В браузере используйте DevTools → Network и смотрите Request Headers / Payload. Для curl полезен verbose-режим:
curl -v https://example.com/
-v может вывести чувствительные заголовки, поэтому перед передачей результата очистите секреты.
Шаг 4. Проверьте, доходит ли запрос до приложения
Это ключевое разделение.
Если application log вообще не содержит проблемного запроса, 400 вероятно формируется раньше:
клиент → CDN/WAF → proxy → приложение
↑
искать здесь
Если запрос есть в application log, ищите ошибку парсинга, валидации или routing уже там.
Шаг 5. Сопоставьте access и error logs
Для Nginx типовая отправная точка:
sudo tail -n 200 /var/log/nginx/access.log
sudo tail -n 200 /var/log/nginx/error.log
Ищите точное время, URL и request ID. Формат и сообщения зависят от вашей конфигурации и версии Nginx, поэтому не делайте вывод по одной строке без контекста.
Шаг 6. Проверьте ограничения proxy и приложения
Проверьте отдельно ограничения на:
- размер request headers;
- размер body;
- допустимую длину URI;
- число параметров;
- parser limits;
- формат JSON/form data.
Если ограничение превышено, более специфический код вроде 413 или 414 может быть информативнее, но фактическое поведение зависит от компонента.
400 в REST API
API-клиенту важно не просто «починить 400», а понять контракт endpoint.
Например:
POST /v1/users HTTP/1.1
Content-Type: application/json
{
"email": "not-an-email"
}
Синтаксически JSON корректен, но значение может не пройти application validation. Некоторые API используют 400, другие — 422 Unprocessable Content. Ориентируйтесь на документированный контракт конкретного API.
Связанный материал: как проверить доступность REST API.
Когда проблема только у одного пользователя
Если сайт работает у остальных, проверьте последовательно:
- тот же URL в приватном окне;
- другой браузер;
- cookies конкретного домена;
- корпоративный proxy/VPN;
- расширения;
- повторение через curl.
Не начинайте с очистки всех данных и переустановки браузера: сначала локализуйте различие.
Когда 400 появился после релиза
Сопоставьте первое появление с:
- новым routing;
- изменением схемы JSON;
- изменением proxy;
- новым WAF-правилом;
- изменением максимального размера заголовков/body;
- новым middleware валидации.
Если 400 резко вырос после deployment, полезно сравнить долю ответов по endpoint и версии приложения.
Как проверить восстановление
После исправления повторите именно тот запрос, который ломался, а не только главную страницу:
for i in {1..10}; do
curl -sS -o /dev/null \
-w '%{http_code} %{time_total}\n' \
'https://example.com/problem-url'
sleep 1
done

Если ошибка зависела от конкретного body или заголовка, тест восстановления должен их сохранять.
Как обнаруживать 400 автоматически
Автоматический HTTP-мониторинг полезен для URL, которые в норме обязаны возвращать определённый успешный код. Он фиксирует внешний симптом и время его появления. Но для поиска причины 400 всё равно понадобятся request details и server-side logs.
UpWatch уместно использовать для регулярного контроля критичного публичного URL, если его ожидаемый HTTP-ответ стабилен.
Типичные ошибки при диагностике
Считать любой 400 проблемой браузера
Ответ мог сформировать WAF, proxy или приложение.
Сразу очищать всё
Это уничтожает часть воспроизводимого контекста. Лучше сначала сравнить запросы.
Смотреть только body ошибки
Кастомная HTML-страница не доказывает, какой компонент вернул статус.
Повторять тот же запрос без изменений
Если причина в самом запросе, RFC-семантика 400 как раз указывает, что повтор без исправления обычно не решает проблему.
Практический чек-лист
- Зафиксировать URL, метод и время.
- Подтвердить реальный HTTP 400 через curl.
- Определить компонент, сформировавший ответ.
- Свести запрос к минимальному.
- По одному вернуть headers, auth и body.
- Сравнить рабочий и нерабочий запрос.
- Проверить application log.
- Проверить proxy/CDN/WAF logs.
- Проверить parser и size limits.
- Исправить причину и повторить исходный запрос серией проверок.
Источники и спецификации
Частые вопросы
Что означает ошибка 400 Bad Request?
Сервер считает запрос некорректным и не обрабатывает его. Причина может быть в синтаксисе запроса, URL, заголовках, cookies, теле запроса или правилах промежуточного proxy/WAF.
Почему сайт даёт 400 только в одном браузере?
Частая причина — отличие запроса: cookies, расширения, proxy-настройки или заголовки. Сравните запрос браузера с приватным окном и минимальным curl-запросом.
Может ли неправильный JSON вызвать 400?
Да. Если endpoint ожидает JSON и не может его разобрать либо отклоняет данные по своему контракту, он может вернуть 400.
Чем 400 отличается от 422?
400 обычно означает некорректность запроса в более общем смысле. 422 используют, когда синтаксис содержимого понятен, но инструкции или данные не могут быть обработаны. Конкретное поведение зависит от API-контракта.
Нужно ли повторять запрос после 400?
Повтор того же запроса без изменений обычно не помогает. Сначала нужно исправить причину, которую сервер считает ошибкой клиента.
Связанные материалы

Ошибка 401 Unauthorized: причины и диагностика
Что означает HTTP 401 Unauthorized, чем он отличается от 403 и как проверить WWW-Authenticate, Authorization, Bearer Token, Basic Auth, cookies и proxy.

Ошибка 403 Forbidden: почему доступ запрещён
Что означает HTTP 403 Forbidden, чем он отличается от 401 и как проверить права доступа, Nginx, файлы, WAF/CDN, IP-ограничения, роли и application authorization.

Ошибка 404 Not Found: причины появления и правильная обработка
Что означает HTTP 404, как найти битые URL, отличить удалённую страницу от ошибки маршрутизации и правильно выбрать между 404, 410 и постоянным перенаправлением.

Как проверить доступность REST API
Практический алгоритм проверки REST API: DNS, TLS, HTTP-код, время ответа, JSON, авторизация и критерии, которые отличают реальную работоспособность от простого HTTP 200.