Что проверять владельцу сайта
Страница с сообщением Bad Request почти не объясняет причину. Полезные данные находятся в access.log, error.log, журнале приложения, CDN и WAF. Я фиксирую время, URL, метод, IP или идентификатор запроса — так одну запись можно провести через все уровни инфраструктуры.
Лимиты Nginx и Apache
Большие cookies и заголовки упираются в буферы, а загрузки — в лимит тела. На Nginx смотрю client_header_buffer_size, large_client_header_buffers и client_max_body_size, но не увеличиваю их вслепую. Сначала измеряю реальный запрос и выясняю, почему он разросся. Лимит может существовать и на CDN, и на балансировщике, и в приложении.
CDN, прокси и WAF
Защитный фильтр способен принять обычное поле формы за атаку. В его журнале обычно видно сработавшее правило. Правильное решение — точечное исключение или корректировка приложения, а не полное отключение защиты. За обратным прокси также проверяю Host, схему, порт и доверенные заголовки.
На стороне сайта проверяю всю цепочку: прокси, веб-сервер, защиту и приложение.
Обновления и код приложения
Если ошибка появилась после релиза, проверяю изменения маршрутов, формы, авторизации и сериализации данных. Откат выполняю только управляемо, с резервной копией и пониманием миграций. Случайное отключение модулей на рабочем сайте может создать больше проблем, чем исходный 400.
Как не допустить повторения
- Собирать URL штатными библиотеками и кодировать параметры, а не склеивать сырой текст.
- Проверять входные данные и возвращать человеку понятное сообщение о конкретном поле.
- Разделять ошибки формата, авторизации, размера и частоты запросов точными HTTP-кодами.
- Не хранить крупные данные в cookies и регулярно удалять устаревшие значения.
- Тестировать формы, API и загрузки через CDN до релиза.
- Связывать логи единым идентификатором запроса и не записывать в них секреты.
- Настроить мониторинг всплеска ответов 400 по маршрутам.
Практичный порядок такой: сначала определяю масштаб, затем воспроизвожу запрос, после этого читаю ответ и журнал того узла, который его отклонил. Чистить всё подряд не нужно — у ошибки 400 почти всегда есть конкретный проблемный фрагмент.