HTTPQUERY
Français

405 Method Not Allowed

Utilisation

Lorsqu’une erreur 405 Method Not Allowed arrive, le client comprend que la ressource existe mais que la méthode indiquée n’est pas autorisée. Dans la réponse, le serveur envoie un en-tête Allow énumérant les méthodes actuellement prises en charge pour la ressource.

Impact SEO

Les moteurs de recherche comme Google n’indexent pas une URL renvoyant un statut 405. Les URL précédemment indexées qui renvoient ce code de statut sont retirées des résultats de recherche.

Exemple

Le client tente un DELETE sur une ressource en lecture seule. Le serveur répond par 405 Method Not Allowed et inclut l’en-tête Allow indiquant que seules GET, HEAD et OPTIONS sont autorisées.

Requête

DELETE /policies.pdf HTTP/1.1
Host: example.com

Réponse

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>

Comment corriger

Un 405 Method Not Allowed signifie que la ressource existe mais ne prend pas en charge la méthode HTTP de la requête.

Vérifiez l’en-tête Allow dans la réponse. Le serveur inclut cet en-tête, qui énumère toutes les méthodes autorisées pour la ressource. Basculez vers l’une des méthodes listées. Inspectez l’en-tête avec curl -I ou dans les DevTools du navigateur, section Response Headers.

Basculez vers la bonne méthode. Une erreur courante consiste à envoyer POST à un point de terminaison en lecture seule, ou GET à un point de terminaison de soumission. Faites correspondre la méthode à l’opération décrite dans la documentation de l’API. Les soumissions de formulaire utilisent GET par défaut tant que l’attribut method n’est pas défini sur post.

Vérifiez la documentation du point de terminaison de l’API. Les API REST définissent des méthodes précises pour chaque chemin de ressource. Confirmez que la combinaison chemin/méthode est valide. Une différence de barre oblique finale entre /api/users et /api/users/ aboutit à des gestionnaires différents dans de nombreux frameworks, et l’un des chemins accepte la méthode tandis que l’autre la refuse.

Vérifiez les restrictions de méthode dans la configuration du serveur. Les directives du serveur web restreignent les méthodes autorisées par location. Dans Apache, les blocs et contrôlent l’accès par méthode :

<LimitExcept GET HEAD OPTIONS>
    Require all denied
</LimitExcept>

Dans nginx, la directive limit_except obtient le même résultat :

location /api {
    limit_except GET POST {
        deny all;
    }
}

Ajustez ces directives pour autoriser la méthode souhaitée.

Gérez les requêtes de préflight CORS. Les requêtes cross-origin déclenchent un préflight OPTIONS avant la méthode réelle. Le serveur doit répondre à OPTIONS avec l’en-tête Access-Control-Allow-Methods correct, énumérant les méthodes autorisées. Une configuration CORS absente ou incomplète renvoie 405 pour le préflight. Dans nginx :

add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";

Examinez le routage du framework applicatif. Les frameworks web (Django, Rails, Express, Spring) n’enregistrent des routes que pour les méthodes explicitement déclarées. Un décorateur de route ou une action de contrôleur manquante pour la méthode demandée produit un 405. Confirmez que la définition de la route correspond à la méthode HTTP visée.

Vérifiez une éventuelle interférence du serveur de fichiers statiques. nginx sert les fichiers statiques par défaut et rejette les requêtes POST vers des ressources statiques. Lorsque le POST est destiné à un backend applicatif, vérifiez que le bloc location achemine la requête vers l’application upstream plutôt que vers le gestionnaire de fichiers statiques.

Références de code

.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