Nginx Error 405: Method Not Allowed (POST to static) — Как исправить
Клиентское веб-приложение отправляет AJAX/Fetch HTTP-запрос методом POST, PUT или DELETE к статическому файлу (например, /api/data.json, /index.html), но получает отказ 405 Method Not Allowed. В логе: 405 Method Not Allowed, client: ..., request: "POST /mock.json HTTP/1.1".
| Тип ресурса | Метод запроса | Поведение Nginx по умолчанию |
|---|---|---|
Статический файл (.html, .json) | GET / HEAD | 200 OK (Штатная отдача контента) |
| Статический файл | POST / PUT / DELETE | 405 Method Not Allowed (Блокировка стандартом) |
| Бэкенд (FastCGI, Proxy, uWSGI) | POST | 200 OK (Передача запроса на обработку бэкенду) |
- По спецификации HTTP статические файлы не могут обрабатывать входящие данные методом POST.
- Ошибка часто встречается при разработке фронтенда с мок-данными (mock JSON files) или при ошибочной отправке веб-форм на статический HTML.
- Вариант 1 (Рекомендуемый): Если POST-запрос должен обрабатываться серверным кодом, убедитесь, что запрос направлен в правильный
locationс бэкендом (Node.js, PHP, Python), а не на статический файл:location /api/ { proxy_pass http://backend_api:8080; } - Вариант 2 (Для статических JSON/HTML моков): Переопределите обработчик ошибки 405 в блоке
server, принудительно трансформируя статус ответа в 200 OK:server { listen 80; server_name example.com; root /var/www/html; # Хак для разрешения POST к статике: error_page 405 =200 $uri; } - Вариант 3 (Через именованный location и proxy_pass):
location / { error_page 405 = @handle_post_static; try_files $uri $uri/ =404; } location @handle_post_static { proxy_pass http://127.0.0.1:80$request_uri; proxy_method GET; } - Проверьте валидность конфигурации и примените:
sudo nginx -t && sudo systemctl reload nginx.
error_page 405 =200 не приводит к изменению файлов на диске — Nginx просто возвратит тело статического файла с кодом 200, полностью проигнорировав переданные в POST данные.Частые вопросы (FAQ)
Почему Nginx запрещает POST к статическим файлам по умолчанию?
Потому что согласно спецификации протокола HTTP метод POST предполагает создание или обработку ресурса на сервере, что невозможно для обычных неизменяемых статических файлов.
Может ли Nginx сохранить отправленные в POST данные в JSON-файл без бэкенда?
Нет, штатный Nginx не умеет писать в файлы из тела POST запроса. Для этого требуется динамический бэкенд или модуль ngx_http_dav_module (для WebDAV PUT запросов).
Как разрешить методы PUT и DELETE для статики?
Для полноценной поддержки загрузки и удаления статических файлов через HTTP методы используется модуль WebDAV: директивы dav_methods PUT DELETE MKCOL COPY MOVE;.
Почему error_page 405 =200 $uri может ломать заголовки?
При внутренней переадресации через error_page метод запроса может неявно трансформироваться, а кеширующие заголовки могут вести себя как для статического GET-ответа.