Если форма или скрипт отправляют POST, а сервер как будто ничего не получает — сначала откройте вкладку Network в DevTools браузера и посмотрите, ушёл ли запрос вообще и какой у него статус ответа. Чаще всего проблема в одном из трёх мест: запрос превращается в GET на редиректе, его блокирует CORS, либо сервер отвечает ошибкой, которую не видно в интерфейсе страницы.
Как проверить, где теряется запрос
Откройте DevTools → Network, отметьте фильтр Fetch/XHR или Doc (если это обычная HTML-форма), отправьте форму заново и найдите строку с нужным адресом. Важны три вещи:
- Метод запроса — если вместо POST в списке стоит GET, значит запрос где-то переадресован с потерей метода.
- Код ответа — 200 значит сервер запрос принял, 4xx/5xx значит ошибка на стороне сервера, а «(failed)» без кода обычно означает, что запрос заблокирован до отправки.
- Вкладка Response — там видно реальный ответ сервера, даже если на странице пользователю ничего не показали.
Из-за чего POST превращается в GET или блокируется
Самая частая причина — серверный редирект с кодом 301 или 302 на URL с завершающим слэшем или на HTTPS-версию адреса: браузер при таком редиректе меняет метод на GET, и тело запроса теряется. Решение — использовать редирект 307 или 308, которые метод сохраняют, либо сразу указывать в форме и в API правильный адрес без редиректа.
Вторая частая причина — CORS: если скрипт отправляет запрос на другой домен или порт, браузер сначала посылает preflight-запрос OPTIONS, и если сервер не отвечает на него нужными заголовками (Access-Control-Allow-Origin, Access-Control-Allow-Methods), основной POST браузер просто не отправляет. Это видно в Network как отдельный OPTIONS-запрос с ошибкой перед основным.
Третья причина — блокировка на уровне сервера или веб-приложения: правила в .htaccess или nginx.conf, ограничивающие методы; защита от CSRF, которая отклоняет запрос без нужного токена; антибот-фильтр или WAF, режущий запросы без определённых заголовков.
Что делать, если сервер отвечает ошибкой
Если статус в Network — 403 или 419, скорее всего сервер отклоняет запрос из-за отсутствующего или устаревшего CSRF-токена: нужно проверить, что токен обновляется при каждой загрузке страницы и передаётся в запросе. Если статус 405 (Method Not Allowed) — сервер вообще не принимает POST по этому адресу, и нужно свериться с документацией API или конфигурацией маршрутов на бэкенде.
Быстрый способ исключить проблему в браузере: повторить тот же запрос через curl или Postman с теми же заголовками и телом. Если там всё работает, дело в JS-коде или настройках CORS, а не в самом сервере.
Если ни один из этих пунктов не подтвердился, стоит временно отключить браузерные расширения и режим блокировки трекеров — некоторые из них режут запросы, которые считают аналитическими или рекламными, даже если это обычная отправка формы.