400 Bad Request
Применение
При получении ошибки 400 Bad Request клиент обязан изучить тело сообщения, чтобы выяснить подробности сбоя. Сервер возвращает достаточно сведений, чтобы клиент мог устранить проблему. Распространённые причины ответа 400 Bad Request:
При возникновении таких ошибок клиенту стоит перепроверить URL, очистить cookie браузера или сжать слишком большой файл перед повторной отправкой.
Примечание
Ошибки 400 — это ошибки клиента (запрос сформирован неверно), тогда как ошибки 500 — сбои сервера (сервер сломался при обработке корректного запроса). Ошибка 400 не является временной. Повтор того же запроса даст ту же ошибку. Клиент обязан исправить запрос перед повторной отправкой. Расширения браузера или рекламное ПО, подставляющие некорректные заголовки, — частая причина неожиданных ошибок 400. Отключение расширений помогает диагностировать проблему.
Влияние на SEO
Поисковые системы вроде Google не индексируют URL, возвращающий статус 400. Ранее проиндексированные URL, которые начали возвращать этот код состояния, удаляются из результатов поиска. Страницы, возвращающие этот код, не расходуют краулинговый бюджет.
Пример
Клиент запрашивает ресурс, путь к которому содержит фигурные скобки. Они недопустимы в URL, поэтому сервер отвечает 400 Bad Request.
Запрос
GET /index{15}.html HTTP/1.1
Host: example.com
Ответ
HTTP/1.1 400 Bad Request
Content-Type: text/html; charset=UTF-8
Content-Length: 131
<html>
<head>
<title>Malformed URL</title>
</head>
<body>
<p>Invalid characters in HTTP request</p>
</body>
</html>
Как исправить
Ответ 400 Bad Request означает, что сервер отклонил запрос из-за проблемы с его форматом на стороне клиента.
Проверьте URL на ошибки кодирования. Специальные символы — фигурные скобки, пробелы или символы вне ASCII — требуют процентного кодирования. Изучите полный путь запроса и строку запроса. Пропустите URL через валидатор, чтобы выявить недопустимые последовательности байтов.
Проверьте заголовки запроса. Некорректный заголовок Host, слишком большой заголовок Cookie или отсутствие обязательного заголовка вызывают эту ошибку. Сравните заголовки со спецификацией API. Используйте DevTools браузера (вкладка Network) или curl -v, чтобы увидеть сырые заголовки, отправленные с запросом.
Изучите тело запроса на синтаксические ошибки. Некорректный JSON, сломанное кодирование формы или несоответствие между заголовком Content-Type и фактическим форматом тела приводят к отклонению запроса. Проверяйте JSON-данные линтером перед отправкой.
Очистите кэш и cookie браузера. Повреждённые или просроченные cookie формируют некорректные заголовки запроса. Частая причина — большие значения cookie, превышающие размеры буферов сервера. Очистите сохранённые данные и повторите запрос.
Сверьте Content-Length с фактическим размером тела. Расхождение между объявленным и переданным числом байтов приводит к ответу об ошибочном запросе.
Проверьте ограничения на размер на стороне сервера. nginx отклоняет слишком большие заголовки с кодом 400, когда они превышают буфер, заданный директивой large_client_header_buffers (по умолчанию: 4 буфера по 8 КБ). Увеличьте значение в nginx.conf:
large_client_header_buffers 4 16k;
Apache применяет LimitRequestFieldSize (по умолчанию 8190 байт) и LimitRequestLine. Увеличьте их в конфигурации сервера или виртуального хоста:
LimitRequestFieldSize 16384
LimitRequestLine 16384
Включите отладочное логирование, чтобы определить точную причину. nginx записывает причину отклонения на уровне info. Установите error_log в info и просмотрите /var/log/nginx/error.log. Apache записывает имя проблемного заголовка в журнал ошибок при LogLevel info.
Проверьте передачу заголовков обратным прокси. Когда nginx или Apache работает как обратный прокси, неверно заданные заголовки Host, X-Forwarded-For или X-Real-IP заставляют бэкенд отклонить запрос. Убедитесь, что директивы proxy_set_header передают корректные значения.
Примеры кода
.NET
HttpStatusCode.BadRequest
Rust
http::StatusCode::BAD_REQUEST
Rails
:bad_request
Go
http.StatusBadRequest
Symfony
Response::HTTP_BAD_REQUEST
Python3.5+
http.HTTPStatus.BAD_REQUEST
Java
java.net.HttpURLConnection.HTTP_BAD_REQUEST
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_BAD_REQUEST
Angular
@angular/common/http/HttpStatusCode.BadRequest