405 Method Not Allowed
Применение
Когда приходит ошибка 405 Method Not Allowed, клиент понимает, что ресурс существует, но указанный метод не разрешён. В составе ответа сервер отправляет заголовок Allow со списком методов, поддерживаемых для этого ресурса в настоящий момент.
Влияние на SEO
Поисковые системы вроде Google не индексируют URL, возвращающий статус 405. Ранее проиндексированные URL, которые начинают возвращать этот код состояния, удаляются из результатов поиска.
Пример
Клиент пытается выполнить DELETE над ресурсом, доступным только для чтения. Сервер отвечает 405 Method Not Allowed и включает заголовок Allow, показывающий, что разрешены лишь GET, HEAD и OPTIONS.
Запрос
DELETE /policies.pdf HTTP/1.1
Host: example.com
Ответ
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS
Content-Type: text/html
Content-Length: 157
<html>
<head>
<title>Operation Not Permitted</title>
</head>
<body>
<p>This resource is read-only and cannot be
deleted.</p>
</body>
</html>
Как исправить
405 Method Not Allowed означает, что ресурс существует, но не поддерживает HTTP-метод, указанный в запросе.
Проверьте заголовок Allow в ответе. Сервер включает этот заголовок со списком всех разрешённых для ресурса методов. Перейдите на один из перечисленных методов. Посмотрите заголовок с помощью curl -I
Используйте правильный метод. Частая ошибка — отправка POST на эндпоинт, доступный только для чтения, или GET на эндпоинт отправки данных. Сопоставьте метод с операцией, описанной в документации API. Отправка форм по умолчанию выполняется методом GET, если атрибуту method не присвоено значение post.
Сверьтесь с документацией эндпоинта API. REST API определяют конкретные методы для каждого пути ресурса. Убедитесь, что сочетание пути и метода допустимо. Расхождение в завершающем слеше между /api/users и /api/users/ во многих фреймворках приводит к разным обработчикам, и один путь принимает метод, а другой — нет.
Проверьте конфигурацию сервера на ограничения по методам. Директивы веб-сервера ограничивают допустимые методы для каждого расположения. В Apache доступом по методу управляют блоки
<LimitExcept GET HEAD OPTIONS>
Require all denied
</LimitExcept>
В nginx того же эффекта позволяет добиться директива limit_except:
location /api {
limit_except GET POST {
deny all;
}
}
Скорректируйте эти директивы, чтобы разрешить нужный метод.
Обрабатывайте предварительные запросы CORS. Кросс-доменные запросы вызывают предварительный запрос OPTIONS перед фактическим методом. Сервер должен отвечать на OPTIONS правильным заголовком Access-Control-Allow-Methods со списком разрешённых методов. Отсутствующая или неполная конфигурация CORS приводит к 405 на предварительный запрос. В nginx:
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
Проверьте маршрутизацию во фреймворке приложения. Веб-фреймворки (Django, Rails, Express, Spring) регистрируют маршруты только для явно объявленных методов. Отсутствующий декоратор маршрута или действие контроллера для запрошенного метода даёт 405. Убедитесь, что определение маршрута соответствует нужному HTTP-методу.
Проверьте, не вмешивается ли обработчик статических файлов. nginx по умолчанию отдаёт статические файлы и отклоняет POST-запросы к статическим ресурсам. Если POST предназначен для серверной части приложения, убедитесь, что блок location направляет запрос в вышестоящее приложение, а не в обработчик статических файлов.
Примеры кода
.NET
HttpStatusCode.MethodNotAllowed
Rust
http::StatusCode::METHOD_NOT_ALLOWED
Rails
:method_not_allowed
Go
http.StatusMethodNotAllowed
Symfony
Response::HTTP_METHOD_NOT_ALLOWED
Python3.5+
http.HTTPStatus.METHOD_NOT_ALLOWED
Java
java.net.HttpURLConnection.HTTP_BAD_METHOD
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_METHOD_NOT_ALLOWED
Angular
@angular/common/http/HttpStatusCode.MethodNotAllowed