Access-Control-Allow-Methods
Verwendung
Bevor der Browser eine ursprungsübergreifende Anfrage mit einer nicht einfachen Methode absendet, stellt er eine Preflight-Anfrage mit OPTIONS. Der Header Access-Control-Request-Method im Preflight gibt an, welche Methode der Client verwenden möchte. Der Server antwortet mit Access-Control-Allow-Methods und bestätigt damit, welche Methoden für die Zielressource akzeptiert werden.
Einfache Methoden (GET, HEAD und POST) sind vom CORS-Protokoll stets erlaubt und müssen hier streng genommen nicht aufgeführt werden. Sie dennoch ausdrücklich zu nennen, ist gängige Praxis und macht die Serverrichtlinie auf einen Blick sichtbar.
Mehrere Methoden erscheinen als kommagetrennte Liste.
Method name list
Eine kommagetrennte Menge von HTTP-Methodennamen, die der Server für ursprungsübergreifenden Zugriff akzeptiert.
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
* (wildcard)
Das Sternchen wirkt bei Anfragen ohne Anmeldeinformationen als Platzhalter und erlaubt jede Methode.
Access-Control-Allow-Methods: *
Hinweis
Bei Anfragen mit Anmeldeinformationen wird der Platzhalter * als wörtliche Zeichenkette behandelt und nicht als Platzhalter. Jede erlaubte Methode muss ausdrücklich aufgeführt werden, wenn Anmeldeinformationen mitgesendet werden.
Beispiel
Eine Preflight-Anfrage erkundigt sich, ob die Methode PUT erlaubt ist. Der Server bestätigt mehrere Methoden.
Anfrage
OPTIONS /api/resource/42 HTTP/1.1
Origin: https://example.com
Access-Control-Request-Method: PUT
Antwort
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
Ein restriktiverer Server erlaubt nur GET und POST.
Access-Control-Allow-Methods: GET, POST
Fehlersuche
Preflight-Fehler im Zusammenhang mit HTTP-Methoden blockieren die eigentliche ursprungsübergreifende Anfrage, bevor der Server den beabsichtigten Vorgang verarbeitet.
Die Konsole zeigt „Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.“ Der Server hat die angeforderte Methode nicht in den Wert von Access-Control-Allow-Methods aufgenommen. Fügen Sie die fehlende Methode der Preflight-Antwort hinzu. In nginx: add_header Access-Control-Allow-Methods “GET, POST, PUT, DELETE, PATCH”; In Apache: Header set Access-Control-Allow-Methods “GET, POST, PUT, DELETE, PATCH”
Der Preflight-Antwort fehlt der Header vollständig. Der OPTIONS-Handler existiert, gibt aber kein Access-Control-Allow-Methods zurück. Vergewissern Sie sich, dass die Preflight-Route diesen Header zusammen mit Access-Control-Allow-Origin und Access-Control-Allow-Headers setzt. Ein fehlender Methoden-Header führt dazu, dass der Browser jede nicht einfache Methode ablehnt.
Der Platzhalter * funktioniert nicht bei Anfragen mit Anmeldeinformationen. Wenn Access-Control-Allow-Credentials auf true steht, wird der Platzhalter als wörtliche Zeichenkette * behandelt und passt auf keine Methode. Führen Sie in Konfigurationen mit Anmeldeinformationen jede erlaubte Methode ausdrücklich auf.
Der Server gibt beim Preflight 405 Method Not Allowed zurück. Der Server besitzt keine Route, die OPTIONS für die Ziel-URL behandelt, sodass die Anfrage auf einen Catch-all trifft, der die Methode ablehnt. Fügen Sie der Route einen OPTIONS-Handler hinzu. In Express: app.options(‘/api/resource’, cors()). In Django behandelt die Middleware django-cors-headers OPTIONS nach der Installation automatisch. Fügen Sie in nginx einen if ($request_method = OPTIONS)-Block hinzu oder nutzen Sie limit_except, um OPTIONS für die location zu erlauben.
Das Framework behandelt OPTIONS automatisch, sendet aber keine CORS-Header. Manche Frameworks antworten auf OPTIONS mit 200 oder 204 und einem einfachen Allow-Header, der die unterstützten Methoden aufführt, hängen jedoch keinerlei CORS-Header an. Der Browser wertet dies als fehlgeschlagenen Preflight, weil Access-Control-Allow-Methods fehlt. Konfigurieren Sie die CORS-Middleware so, dass sie OPTIONS-Anfragen vor dem integrierten Handler des Frameworks abfängt. Registrieren Sie in Spring Boot eine CorsFilter-Bean. Rufen Sie in ASP.NET services.AddCors() mit der passenden Richtlinie vor app.UseRouting() auf.