HTTPQUERY
Français

Access-Control-Allow-Methods

Utilisation

Avant d’envoyer une requête cross-origin utilisant une méthode non simple, le navigateur émet une requête de préflight OPTIONS. L’en-tête Access-Control-Request-Method du préflight indique quelle méthode le client compte employer. Le serveur répond avec Access-Control-Allow-Methods pour confirmer quelles méthodes sont acceptées pour la ressource visée.

Les méthodes simples (GET, HEAD et POST) sont toujours autorisées par le protocole CORS et n’ont pas strictement besoin d’être listées ici. Les mentionner explicitement est une pratique courante qui rend la politique du serveur immédiatement lisible.

Plusieurs méthodes se présentent sous forme de liste séparée par des virgules.

Liste de noms de méthodes

Un ensemble de noms de méthodes HTTP, séparés par des virgules, que le serveur accepte pour les accès cross-origin.

Access-Control-Allow-Methods: GET, POST, PUT, DELETE

* (joker)

L’astérisque joue le rôle de joker pour les requêtes sans identifiants, autorisant n’importe quelle méthode.

Access-Control-Allow-Methods: *

Remarque

Pour les requêtes avec identifiants, le joker * est traité comme une chaîne littérale et non comme un joker. Chaque méthode autorisée doit être listée explicitement dès lors que des identifiants sont présents.

Exemple

Une requête de préflight demande si la méthode PUT est autorisée. Le serveur confirme plusieurs méthodes.

Requête

OPTIONS /api/resource/42 HTTP/1.1
Origin: https://example.com
Access-Control-Request-Method: PUT

Réponse

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Max-Age: 7200

Un serveur plus restrictif n’autorise que GET et POST.

Access-Control-Allow-Methods: GET, POST

Dépannage

Les échecs de préflight liés aux méthodes HTTP bloquent la véritable requête cross-origin avant que le serveur ne traite l’opération visée.

La console affiche « Method PUT is not allowed by Access-Control-Allow-Methods in preflight response. » Le serveur n’a pas inclus la méthode demandée dans la valeur d’Access-Control-Allow-Methods. Ajoutez la méthode manquante à la réponse de préflight. Dans nginx : add_header Access-Control-Allow-Methods “GET, POST, PUT, DELETE, PATCH”; Dans Apache : Header set Access-Control-Allow-Methods “GET, POST, PUT, DELETE, PATCH”

L’en-tête est totalement absent de la réponse de préflight. Le gestionnaire OPTIONS existe mais ne renvoie pas Access-Control-Allow-Methods. Vérifiez que la route de préflight définit cet en-tête aux côtés d’Access-Control-Allow-Origin et d’Access-Control-Allow-Headers. L’absence de l’en-tête de méthodes conduit le navigateur à rejeter toute méthode non simple.

Le joker * ne fonctionne pas avec les requêtes avec identifiants. Lorsque Access-Control-Allow-Credentials vaut true, le joker est traité comme la chaîne littérale * et ne correspond à aucune méthode. Listez explicitement chaque méthode autorisée dans les configurations avec identifiants.

Le serveur renvoie 405 Method Not Allowed pendant le préflight. Le serveur n’a aucune route traitant OPTIONS pour l’URL visée, si bien que la requête atteint un gestionnaire fourre-tout qui rejette la méthode. Ajoutez un gestionnaire OPTIONS à la route. Dans Express : app.options(‘/api/resource’, cors()). Dans Django, le middleware django-cors-headers traite OPTIONS automatiquement une fois installé. Dans nginx, ajoutez un bloc if ($request_method = OPTIONS) ou utilisez limit_except pour autoriser OPTIONS sur le location.

Le framework traite OPTIONS automatiquement sans inclure les en-têtes CORS. Certains frameworks répondent à OPTIONS par un 200 ou un 204 accompagné d’un simple en-tête Allow listant les méthodes prises en charge, sans joindre le moindre en-tête CORS. Le navigateur considère qu’il s’agit d’un préflight échoué, puisque Access-Control-Allow-Methods est absent. Configurez le middleware CORS pour intercepter les requêtes OPTIONS avant le gestionnaire intégré du framework. Dans Spring Boot, enregistrez un bean CorsFilter. Dans ASP.NET, appelez services.AddCors() avec la bonne politique avant app.UseRouting().