15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
10.10.2024

Что такое ошибка 400 Bad Request и как её исправить?

A 400 Bad Request — это код статуса HTTP/1.1, определённый в RFC 9110, который сигнализирует о том, что сервер получил запрос, который не может или не будет обрабатывать, поскольку сам запрос сформирован некорректно. В отличие от ошибок 5xx, которые возникают на стороне сервера, ошибка 400 возлагает ответственность исключительно на клиента — это означает, что проблема заключается в отправляемом запросе, а не в способности сервера ответить.

На практике ошибка 400 возникает ещё до того, как сервер пытается выполнить запрос. Сервер анализирует входящее HTTP-сообщение, обнаруживает что-то структурно или семантически недопустимое — повреждённый заголовок, некорректный URI, слишком большую полезную нагрузку, неверный cookie — и немедленно возвращает 400 Bad Request, не продолжая обработку. Понимание этого различия — кратчайший путь к правильной диагностике.

Что на самом деле означает код статуса 400 на уровне протокола

HTTP работает на основе строгого контракта «запрос-ответ». Каждый запрос должен соответствовать грамматике, определённой в спецификации HTTP. Когда клиент отправляет сообщение, нарушающее эту грамматику, сервер вправе и обязан отклонить его с ответом 400.

Сервер не регистрирует 400 как собственный сбой. Он фиксирует это как отклонённый клиентский запрос. Именно поэтому слепой перезапуск сервера или очистка кэша CDN редко устраняет настоящую ошибку 400 — первопричина почти всегда кроется в формировании запроса.

Распространённые варианты отображения этой ошибки в браузере:

  • 400 Bad Request
  • HTTP Error 400
  • Bad Request — Invalid URL
  • 400. That's an error. Your client has issued a malformed or illegal request.
  • 400 Bad Request. The server cannot or will not process the request due to something that is perceived to be a client error.

Все они соответствуют одному и тому же базовому коду статуса HTTP. Формулировка различается в зависимости от серверного программного обеспечения (Apache, Nginx, IIS, Cloudflare) и фреймворка приложения.

Первопричины ошибки 400 Bad Request

Прежде чем предпринимать какие-либо действия по исправлению, необходимо точно определить причину. Причины делятся на две категории: на стороне клиента и неправильная конфигурация на стороне сервера.

Причины на стороне клиента

Некорректный или неправильно закодированный URL

URL, содержащий незакодированные пробелы, недопустимые символы или нарушенные последовательности процентного кодирования, будет немедленно отклонён. Спецификация HTTP требует, чтобы все символы за пределами зарезервированного набора (A–Z, a–z, 0–9, -, _, ., ~) были закодированы в процентном формате перед передачей.

Повреждённые или слишком большие cookie

Cookie передаются в заголовке запроса Cookie. Если значение cookie некорректно, превышает ограничение браузера на размер одного cookie (обычно 4096 байт) или содержит символы, нарушающие RFC 6265, сервер может отклонить весь запрос. Это одна из наиболее часто упускаемых из виду причин периодических ошибок 400 на сайтах, которые пользователь ранее посещал без проблем.

Недопустимые или отсутствующие обязательные заголовки запроса

Некоторые API и веб-приложения применяют строгую проверку заголовков. Отсутствующий Content-Type в POST-запросе, некорректный заголовок Authorization или заголовок Accept с неподдерживаемым типом медиа — всё это может вызвать ошибку 400.

Слишком большая полезная нагрузка запроса

Веб-серверы и обратные прокси устанавливают максимальные ограничения на размер тела запроса. Nginx использует client_max_body_size (по умолчанию: 1 МБ); Apache использует LimitRequestBody. Превышение этих порогов приводит к ответу 400 или 413 в зависимости от конфигурации.

Устаревший или некорректный кэш DNS

Хотя сбои разрешения DNS обычно приводят к ошибкам подключения, а не к HTTP 400, отравленный или устаревший кэш DNS, направляющий запрос на неправильный сервер — тот, который не распознаёт заголовок Host — может привести к тому, что неверный источник вернёт ошибку 400.

Расширения браузера, вмешивающиеся в заголовки запросов

Некоторые блокировщики рекламы, инструменты защиты конфиденциальности и расширения для разработчиков изменяют исходящие HTTP-заголовки. Если расширение внедряет некорректный или дублирующийся заголовок, сервер может отклонить запрос.

Причины на стороне сервера

Неправильно настроенные правила .htaccess (Apache)

Правила перезаписи, директивы перенаправления или записи контроля доступа с синтаксическими ошибками могут заставить Apache генерировать ошибку 400 ещё до того, как запрос достигнет уровня приложения.

Ошибки конфигурации Nginx

Недопустимые директивы server_name, нарушенные блоки location или некорректные настройки proxy_pass могут заставить Nginx возвращать ошибку 400 для запросов, которые он не может маршрутизировать.

Избыточная блокировка WAF или плагина безопасности

Межсетевые экраны веб-приложений — будь то на уровне сервера (ModSecurity), уровне CDN (Cloudflare WAF) или уровне приложения (плагины безопасности WordPress) — могут помечать легитимные запросы как вредоносные и возвращать ошибку 400 или 403. Это часто происходит, когда параметры запроса содержат строки, соответствующие сигнатурам SQL-инъекций или XSS.

Сбои валидации на уровне приложения

Фреймворки, такие как Laravel, Django или Express.js, возвращают 400 при сбое валидации входных данных — например, если обязательное поле JSON отсутствует, поле даты имеет неверный формат или числовой параметр получает строковое значение.

Как исправить ошибку 400 Bad Request: действия на стороне клиента

1. Проверьте и исправьте URL

Проверьте URL посимвольно. Обратите особое внимание на:

  • Незакодированные пробелы: Пробел должен быть %20, а не буквальным пробелом или + (вне данных формы).
  • Двойные или отсутствующие слэши: https://example.com//path или https://example.com/path? с висящим знаком вопроса.
  • Нарушенное процентное кодирование: Символ %, за которым не следуют ровно две шестнадцатеричные цифры, является недопустимым.
  • Символы не из набора ASCII: Доменные имена с символами Unicode должны использовать Punycode; сегменты пути с Unicode должны быть закодированы в процентном формате в UTF-8.

Правильно закодированный URL выглядит так:

https://example.com/search?q=hello%20world&lang=en

А не так:

https://example.com/search?q=hello world&lang=en

Это устраняет большинство ошибок 400, возникающих на сайтах, которые пользователь ранее посещал.

Google Chrome:

  1. Откройте chrome://settings/clearBrowserData
  2. Установите временной диапазон За всё время
  3. Отметьте Файлы cookie и другие данные сайтов и Кэшированные изображения и файлы
  4. Нажмите Удалить данные

Mozilla Firefox:

  1. Откройте about:preferences#privacy
  2. В разделе Куки и данные сайтов нажмите Удалить данные
  3. Выберите оба параметра и подтвердите

Safari (macOS):

  1. Перейдите в Safari > Настройки > Конфиденциальность
  2. Нажмите Управление данными веб-сайтов, затем Удалить все

Для более точного подхода — особенно полезного, когда вы не хотите потерять все данные сессии — используйте инструменты разработчика браузера для удаления только cookie конкретного домена:

  1. Откройте DevTools (F12 или Cmd+Option+I)
  2. Перейдите в Application > Storage > Cookies
  3. Выберите домен и удалите отдельные cookie

3. Очистите кэш DNS

Windows:

ipconfig /flushdns

macOS (Ventura, Sonoma, Sequoia):

sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

Linux (systemd-resolved):

sudo systemd-resolve --flush-caches

Linux (nscd):

sudo service nscd restart

После очистки убедитесь в правильности разрешения перед повторной попыткой:

nslookup example.com

4. Отключите расширения браузера

Расширения, изменяющие HTTP-заголовки, наиболее вероятно являются виновниками. Вместо того чтобы отключать все расширения одновременно, сначала воспользуйтесь режимом инкогнито или приватным режимом браузера — большинство расширений по умолчанию отключены в приватных окнах. Если страница корректно загружается в режиме инкогнито, причина в расширении.

Чтобы определить конкретное расширение в Chrome:

  1. Перейдите на chrome://extensions/
  2. Отключите все расширения
  3. Включайте их по одному, перезагружая страницу после каждого

5. Проверьте в другом браузере, на другом устройстве или в другой сети

Этот шаг быстро определяет, является ли проблема специфичной для окружения. Если страница загружается на мобильном устройстве с использованием мобильных данных, но не работает на вашем компьютере, проблема, скорее всего, локальная — либо конфигурация браузера, прокси на уровне сети, либо корпоративный межсетевой экран, изменяющий заголовки запросов.

Как исправить ошибку 400 Bad Request: действия на стороне сервера

Эти шаги применимы к владельцам сайтов, разработчикам и системным администраторам, имеющим доступ к серверу или панели управления хостингом.

6. Проанализируйте журналы доступа и ошибок сервера

Журналы сервера — это окончательный инструмент диагностики. Запись 400 в журнале доступа покажет необработанную строку запроса, которая была отклонена.

Журнал ошибок Nginx (путь по умолчанию):

tail -n 100 /var/log/nginx/error.log | grep " 400 "

Журнал ошибок Apache:

tail -n 100 /var/log/apache2/error.log

Журнал доступа Nginx — фильтр по ответам 400:

awk '$9 == 400' /var/log/nginx/access.log | tail -20

Ищите закономерности: поступают ли ошибки 400 с определённой конечной точки, определённого пользовательского агента или определённого параметра? Это значительно сужает круг первопричин.

Если вы используете среду VPS Хостинг, у вас есть прямой SSH-доступ к этим журналам. На управляемом Общем веб-хостинге журналы доступа обычно доступны через раздел Ошибки в cPanel или через загрузку журнала Raw Access.

7. Проверьте файл .htaccess (Apache)

Одна синтаксическая ошибка в .htaccess может заставить Apache возвращать ошибки 400 или 500 для каждого запроса. Проверьте синтаксис файла без перезапуска Apache:

apachectl -t

Распространённые проблемы с .htaccess, приводящие к ошибкам 400:

  • Шаблоны RewriteRule с неэкранированными специальными символами
  • LimitRequestBody установлен на неожиданно низкое значение
    Некорректные директивы Header

Пример проблемной директивы:

# This will cause a 400 if the header value is malformed
RequestHeader set X-Custom-Header "value with "quotes""

Исправленная версия:

RequestHeader set X-Custom-Header "value with escaped quotes"

8. Проверьте конфигурацию Nginx

Проверьте всю конфигурацию Nginx перед применением изменений:

nginx -t

Обратите внимание на client_max_body_size, если пользователи загружают файлы:

http {
    client_max_body_size 50M;
}

Также проверьте large_client_header_buffers — если заголовки запроса (включая cookie) превышают размер буфера, Nginx возвращает ошибку 400:

http {
    large_client_header_buffers 4 16k;
}

После редактирования перезагрузите без простоя:

nginx -s reload

9. Увеличьте ограничения на загрузку файлов

Если ошибка 400 возникает именно при загрузке файлов, тело запроса, скорее всего, превышает настроенный лимит сервера.

PHP (php.ini):

upload_max_filesize = 50M
post_max_size = 55M

Apache (httpd.conf или .htaccess):

LimitRequestBody 52428800

Nginx (nginx.conf):

client_max_body_size 50M;

Обратите внимание, что post_max_size в PHP всегда должен быть больше upload_max_filesize, иначе PHP молча отбросит загрузку и приложение может вернуть ошибку 400.

10. Проверьте правила WAF и плагины безопасности

Если вы используете ModSecurity, Cloudflare WAF или плагин безопасности WordPress (Wordfence, iThemes Security), временно отключите набор правил WAF и проверьте, исчезнет ли ошибка 400. Если да, просмотрите журнал аудита WAF, чтобы определить, какое правило срабатывает:

tail -f /var/log/modsec_audit.log

Не отключайте WAF полностью. Вместо этого создайте целевое исключение для легитимного шаблона запроса, который блокируется.

400 Bad Request в сравнении со связанными кодами ошибок HTTP

Понимание места ошибки 400 в таксономии ошибок HTTP предотвращает неверную диагностику.

Код статусаНазваниеИсточник ошибкиТипичная причина
400Bad RequestКлиентНекорректный синтаксис запроса, недопустимые заголовки, неверное кодирование
401UnauthorizedКлиентОтсутствующие или недопустимые учётные данные аутентификации
403ForbiddenПолитика сервераДопустимый запрос, но доступ запрещён правилами сервера
404Not FoundСерверРесурс не существует по запрошенному URI
413Content Too LargeКлиентТело запроса превышает настроенный лимит размера сервера
414URI Too LongКлиентURI запроса превышает максимальную длину URI сервера
422Unprocessable ContentКлиентСинтаксически корректный, но семантически неверный (часто встречается в REST API)
431Request Header Fields Too LargeКлиентРазмер отдельного заголовка или суммарный размер заголовков превышает лимиты сервера
500Internal Server ErrorСерверНеобработанное исключение или неправильная конфигурация на сервере
502Bad GatewayСервер/ПроксиВышестоящий сервер вернул недопустимый ответ

Ключевое операционное различие: 413 (Content Too Large) — более семантически точный код для слишком больших загрузок, однако многие серверы — особенно старые конфигурации Apache и Nginx — вместо него возвращают 400. Если вы видите ошибку 400 при загрузке файла, всегда сначала проверяйте ограничения на размер тела запроса.

Ошибки 400 в контексте API

REST и GraphQL API широко используют 400 как стандартный ответ на сбои валидации входных данных. Если вы разрабатываете или используете API, тело ответа 400 обычно содержит структурированные данные об ошибке:

{
  "error": "Bad Request",
  "message": "The 'email' field must be a valid email address.",
  "field": "email",
  "code": 400
}

При отладке ошибок 400 в API:

  • Убедитесь, что заголовок Content-Type соответствует формату тела (application/json для JSON-данных, multipart/form-data для загрузки файлов)
  • Подтвердите наличие всех обязательных полей и заголовков с правильными типами данных
  • Убедитесь, что строковые значения не превышают ограничения максимальной длины
  • Проверьте форматы даты и времени согласно спецификации API (стандартом является ISO 8601: 2024-01-15T10:30:00Z)
  • Проверьте формат заголовка Authorization — токены Bearer должны иметь префикс Bearer , а не передаваться в сыром виде

Для команд, запускающих API-сервисы на Выделенных серверах, включение детального журналирования запросов на уровне приложения (а не только на уровне веб-сервера) критически важно для диагностики паттернов ошибок 400 в масштабе.

Диагностика ошибок 400 с помощью инструментов разработчика браузера

Панель Network в инструментах разработчика браузера — наиболее точный клиентский инструмент диагностики.

  1. Откройте DevTools (F12)
  2. Перейдите на вкладку Network
  3. Воспроизведите запрос, вызывающий ошибку 400
  4. Нажмите на неудавшийся запрос в водопаде
  5. Проверьте вкладку Headers — просмотрите как Request Headers, так и Response Headers
  6. Проверьте вкладку Response на наличие деталей ошибки, возвращённых сервером

Панель Request Headers покажет именно то, что отправил браузер. Сравните это с тем, что ожидает сервер. Обратите особое внимание на:

  • Значение заголовка Host
  • Размер и содержимое заголовка Cookie
  • Content-Type и Content-Length для POST/PUT-запросов
    Любые пользовательские заголовки, внедрённые расширениями
    
    Предотвращение ошибок 400 в веб-приложениях
    Для разработчиков и системных администраторов превентивные меры значительно снижают частоту возникновения ошибок 400.
    Санитизация и валидация входных данных на уровне приложения — Проверяйте все пользовательские входные данные до того, как они достигнут уровня маршрутизации сервера. Возвращайте описательные ответы 400 с сообщениями об ошибках на уровне полей, а не общие сбои.
    Реализуйте правильное кодирование URL в клиентском коде — Используйте встроенные функции кодирования, а не ручные манипуляции со строками:
    // JavaScript — correct approach
    const query = encodeURIComponent("hello world & more");
    const url = `https://example.com/search?q=${query}`;
    # Python — correct approach
    from urllib.parse import urlencode
    params = urlencode({"q": "hello world & more"})
    url = f"https://example.com/search?{params}"
    Установите явные и разумные ограничения на размер тела запроса — Не оставляйте client_max_body_size на значении по умолчанию 1 МБ, если ваше приложение принимает загрузку файлов. Equally, не устанавливайте его без ограничений — это создаёт вектор атаки типа «отказ в обслуживании».
    Отслеживайте частоту ошибок 400 в продакшене — Внезапный всплеск ошибок 400 часто является первым признаком того, что бот сканирует уязвимости, клиентская форма сломана или развёртывание внесло критическое изменение в API. Настройте оповещения о частоте ошибок 4xx в вашем стеке мониторинга (Grafana, Datadog, CloudWatch).
    Используйте HTTPS с действующим SSL-сертификатом — Некоторые ошибки 400 возникают, когда клиенты отправляют HTTPS-запросы на сервер, который не настроен должным образом для TLS, или когда несоответствие сертификата приводит к сбою TLS-рукопожатия ещё до достижения уровня HTTP. Обеспечение того, что ваши SSL-сертификаты действительны, правильно установлены и охватывают все необходимые поддомены, полностью устраняет этот класс ошибок.
    Правильно настройте среды панели управления — Если вы управляете несколькими сайтами через панель управления, неправильно настроенные определения виртуальных хостов являются распространённым источником ошибок 400. Среды, использующие VPS с cPanel, должны убедиться, что корневой каталог документов каждого домена, привязка SSL и правила перезаписи правильно ограничены во избежание междоменного загрязнения запросов.
    Матрица решений: диагностика ошибки 400 по симптому
    
    
    
    Симптом
    Наиболее вероятная причина
    Первое действие
    
    
    
    
    
    
    
    
    —
    —
    —
    
    
    
    
    
    
    
    
    Ошибка 400 на каждой странице одного сайта, на других работает
    Повреждённый cookie конкретного сайта
    Очистите cookie только для этого домена
    
    
    
    
    
    
    
    
    Ошибка 400 только при отправке формы или загрузке файла
    Слишком большая полезная нагрузка или неверный `Content-Type`
    Проверьте ограничения на размер тела запроса сервера и `enctype` формы
    
    
    
    
    
    
    
    
    Ошибка 400 на URL, введённом вручную
    Ошибка кодирования URL или опечатка
    Перекодируйте URL; проверьте наличие недопустимых символов
    
    
    
    
    
    
    
    
    Ошибка 400 только в вызовах API
    Отсутствующий обязательный заголовок или недопустимый JSON
    Проверьте заголовки запроса и валидируйте схему полезной нагрузки
    
    
    
    
    
    
    
    
    Ошибка 400 после изменения конфигурации сервера
    Синтаксическая ошибка в `.htaccess` или конфигурации Nginx
    Выполните `apachectl -t` или `nginx -t`
    
    
    
    
    
    
    
    
    Ошибка 400 для всех пользователей одновременно
    Срабатывание правила WAF или неправильная конфигурация сервера
    Проверьте журнал аудита WAF и журнал ошибок сервера
    
    
    
    
    
    
    
    
    Ошибка 400 только в одном браузере
    Расширение внедряет некорректные заголовки
    Проверьте в режиме инкогнито; отключите расширения
    
    
    
    
    
    
    
    
    Ошибка 400 после изменения DNS
    Кэш DNS указывает на неправильный сервер
    Очистите кэш DNS; проверьте с помощью `nslookup`
    
    
    
    
    
    Технический чеклист: устранение ошибки 400 Bad Request
    Для конечных пользователей:
    
    Вручную проверьте и введите URL заново, исправив все проблемы с кодированием
    Очистите cookie и кэш конкретно для затронутого домена
    Проверьте в приватном окне/режиме инкогнито, чтобы исключить расширения
    Очистите локальный кэш DNS
    Проверьте в другом браузере, на другом устройстве и с другим сетевым подключением
    
    Для разработчиков и потребителей API:
    
    Убедитесь, что Content-Type соответствует формату тела запроса
    Подтвердите наличие всех обязательных полей и заголовков с правильными типами данных
    Убедитесь, что строковые значения, даты и числовые типы соответствуют контракту API
    Используйте curl с подробным выводом для проверки необработанного HTTP-обмена:
    
    curl -v -X POST https://api.example.com/endpoint 
      -H "Content-Type: application/json" 
      -H "Authorization: Bearer YOUR_TOKEN" 
      -d '{"key": "value"}'
    Для системных администраторов:
    
    Извлеките и отфильтруйте журналы ошибок сервера на наличие записей 400
    Проверьте синтаксис конфигурации веб-сервера (nginx -t / apachectl -t)
    Проверьте client_max_body_size (Nginx) и LimitRequestBody (Apache)
    Проверьте large_client_header_buffers в Nginx, если запросы с большим количеством cookie завершаются ошибкой
    Проверьте правила WAF и журнал аудита ModSecurity
    Убедитесь в действительности и охвате SSL/TLS-сертификата
    Убедитесь в синтаксической корректности правил перезаписи .htaccess

Часто задаваемые вопросы

В чём разница между ошибками 400 и 404?

Ошибка 400 означает, что сервер не смог понять запрос из-за его некорректного формирования — вина лежит на том, как был составлен запрос. Ошибка 404 означает, что запрос был корректным и понятым, но запрошенный ресурс просто не существует на сервере. Для их устранения требуются совершенно разные подходы.

Может ли ошибка 400 Bad Request быть вызвана сервером, а не клиентом?

Да, косвенно. Неправильная конфигурация сервера — например, чрезмерно ограничительное правило WAF, некорректная настройка large_client_header_buffers в Nginx или нарушенная директива .htaccess — может заставить сервер отклонять технически корректные запросы. В таких случаях спецификация HTTP всё равно соблюдается (сервер отклоняет то, что воспринимает как плохой запрос), но реальная вина лежит в конфигурации сервера, а не в запросе клиента.

Почему очистка cookie устраняет ошибку 400?

Cookie отправляются в заголовке запроса Cookie при каждом запросе к соответствующему домену. Если cookie, хранящийся в браузере, некорректен, истёк способом, который сервер не принимает, или стал слишком большим (превышая ограничения large_client_header_buffers в Nginx), сервер отклоняет весь запрос с ошибкой 400 ещё до его обработки. Удаление повреждённого cookie убирает некорректные данные из заголовка.

Как исправить ошибку 400 при загрузке файлов на мой сайт?

Загрузка превышает либо ограничение на размер тела запроса веб-сервера, либо ограничение на размер загрузки PHP. В Nginx увеличьте client_max_body_size в nginx.conf. В Apache измените LimitRequestBody в .htaccess или httpd.conf. Для PHP-приложений обновите upload_max_filesize и post_max_size в php.ini, убедившись, что post_max_size больше upload_max_filesize. После внесения изменений перезапустите соответствующие службы.

Как определить, что ошибка 400 исходит от CDN или WAF, а не от моего исходного сервера?

Проверьте заголовки ответа. Cloudflare добавляет заголовки cf-ray и server: cloudflare. AWS CloudFront добавляет x-amz-cf-id. Если эти заголовки присутствуют в ответе 400, отклонение произошло на граничном узле, а не на вашем исходном сервере. Просмотрите журналы WAF CDN или панель событий межсетевого экрана, чтобы определить, какое правило вызвало блокировку, затем создайте целевое исключение для легитимного паттерна трафика.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать