HTTPQUERY
Русский

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 или в DevTools браузера в разделе Response Headers.

Используйте правильный метод. Частая ошибка — отправка 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