Pourquoi un serveur répond 405, l'en-tête Allow qu'il doit envoyer, et comment corriger le problème dans Flask, Express et Next.js. Générez la bonne réponse 405 pour votre propre route.
Un 405 Method Not Allowed signifie que l'URL existe mais n'accepte pas la méthode HTTP utilisée, par exemple un POST envoyé à une route qui ne gère que GET. Le serveur doit lister les méthodes qu'il accepte dans un en-tête Allow. Envoyez l'une de ces méthodes, ou ajoutez côté serveur un gestionnaire pour la vôtre.
Le 405 comparé à ses voisins
Statut
Signification
Correctif habituel
405 Method Not Allowed
La ressource existe ; cette méthode n'est pas acceptée pour elle
Utiliser une méthode de Allow, ou ajouter un gestionnaire
404 Not Found
Aucune ressource à cette URL
Corriger le chemin
501 Not Implemented
Le serveur ne prend pas du tout en charge la méthode
Utiliser une méthode standard
403 Forbidden
La méthode est correcte, mais vous n'avez pas l'autorisation
Obtenir l'accès ou changer de compte
Cochez les méthodes que gère votre route, choisissez la méthode qu'envoie un client, et le générateur affiche la réponse exacte que le serveur doit renvoyer : un succès normal, ou un 405 avec un en-tête Allow listant les méthodes dans l'ordre où vous les avez cochées.
Cochez chaque méthode que votre route gère réellement.
Choisissez la méthode utilisée par la requête qui échoue. Le panneau Network de votre navigateur l'affiche.
Lisez la réponse. Un 405 doit inclure Allow avec toutes les méthodes cochées.
Copiez ci-dessous le correctif qui correspond à votre framework.
Vérifiez d'abord l'en-tête Allow de la réponse en échec. Il indique les méthodes que le serveur accepte, ce qui révèle souvent un formulaire qui utilise la mauvaise.
Un formulaire sans attribut method est envoyé en GET. Si votre gestionnaire n'accepte que POST, ajoutez method="post" au formulaire.
Un slash final ou une redirection peut transformer un POST en GET en chemin, qui arrive alors sur une route réservée à POST. Examinez chaque étape dans le panneau Network.
Quand vous écrivez le serveur, renvoyez un 405 avec Allow plutôt qu'un 404 pour un chemin connu appelé avec la mauvaise méthode. Les clients et les outils d'API pourront alors expliquer l'erreur.
Questions fréquentes
Le 405 est-il un problème client ou serveur ?
C'est un code 4xx : c'est donc la requête que le serveur conteste. Soit le client doit utiliser une autre méthode, soit le responsable du serveur doit ajouter la prise en charge de celle qui est envoyée.
Une réponse 405 doit-elle inclure l'en-tête Allow ?
Oui. La RFC 9110 indique que le serveur doit générer un champ d'en-tête Allow listant les méthodes que la ressource prend actuellement en charge. Une liste vide est autorisée quand la ressource n'accepte aucune méthode.
Pourquoi ai-je un 405 quand j'envoie un formulaire ?
En général, le formulaire envoie une méthode que la route n'accepte pas. Une route Flask, par exemple, ne répond qu'à GET tant que vous ne passez pas methods=["GET", "POST"] au décorateur de route.
Pourquoi Express me renvoie-t-il un 404 au lieu d'un 405 ?
Express traite de la même façon une méthode et un chemin sans correspondance : aucune route n'a répondu, donc la requête tombe dans le gestionnaire 404. Ajoutez une capture du chemin avec app.all pour envoyer vous-même le 405.
Quelle est la différence entre 405 et 501 ?
Le 405 signifie que cette ressource refuse une méthode que le serveur comprend. Le 501 signifie que le serveur ne prend en charge la méthode pour aucune ressource.
La règle de la spécification
La méthode est reconnue par le serveur d'origine, mais la ressource cible ne la prend pas en charge. Comme le serveur sait quelles méthodes fonctionneraient, la spécification l'oblige à le dire via Allow. Un 405 sans Allow est incomplet.
D'où vient généralement un 405
Les routes de framework enregistrées pour une seule méthode, les passerelles d'API qui associent chaque méthode séparément, et les serveurs de fichiers statiques qui servent des fichiers sans accepter d'écritures en sont les sources habituelles. Dans chaque cas, le chemin correspondait mais pas la méthode.
Les route handlers Next.js exportent une fonction par méthode. Les noms pris en charge sont GET, POST, PUT, PATCH, DELETE, HEAD et OPTIONS, et quand vous n'exportez pas OPTIONS, Next.js y répond pour vous avec un en-tête Allow construit à partir des méthodes que vous avez exportées.
Correctifs par stack
Flask : déclarer chaque méthode acceptée par la route
Sans methods=, la route ne répond qu'à GET (Flask ajoute HEAD et OPTIONS automatiquement).
Express : envoyer un vrai 405 au lieu de tomber sur un 404
app.all placé après les vrais gestionnaires intercepte toutes les autres méthodes pour le même chemin.
Route handler Next.js : exporter la méthode que vous appelez
app/api/items/route.ts. Une requête avec une méthode que vous n'avez pas exportée ne peut pas atteindre votre code.
HTML : donner au formulaire la méthode attendue par le serveur
Un formulaire sans attribut method est envoyé en GET.
Générateur de réponse 405
Méthodes gérées par cette route
Méthode envoyée par le client
Ce que le serveur doit renvoyer
La méthode est prise en charge, donc aucun 405 n'entre en jeu.
La méthode n'est pas dans la liste, donc la réponse est un 405 avec un en-tête Allow nommant les {n} méthodes cochées.