HTTPQUERY
Deutsch

405 Method Not Allowed

Verwendung

Trifft ein Fehler 405 Method Not Allowed ein, weiß der Client, dass die Ressource existiert, die angegebene Methode jedoch nicht zulässig ist. Als Teil der Antwort sendet der Server einen Allow-Header, der die derzeit für die Ressource unterstützten Methoden auflistet.

SEO-Auswirkung

Suchmaschinen wie Google indexieren eine URL nicht, die den Status 405 zurückgibt. Bereits indexierte URLs, die diesen Statuscode zurückgeben, werden aus den Suchergebnissen entfernt.

Beispiel

Der Client versucht, eine schreibgeschützte Ressource per DELETE zu löschen. Der Server antwortet mit 405 Method Not Allowed und fügt den Allow-Header hinzu, der zeigt, dass nur GET, HEAD und OPTIONS zulässig sind.

Anfrage

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

Antwort

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>

Behebung

Ein 405 Method Not Allowed bedeutet, dass die Ressource existiert, die HTTP-Methode der Anfrage aber nicht unterstützt wird.

Prüfen Sie den Allow-Header in der Antwort. Der Server nimmt diesen Header auf und listet darin jede für die Ressource zulässige Methode auf. Wechseln Sie zu einer der aufgeführten Methoden. Sehen Sie sich den Header mit curl -I oder in den Browser-DevTools im Abschnitt Response Headers an.

Wechseln Sie zur richtigen Methode. Ein häufiger Fehler ist das Senden von POST an einen schreibgeschützten Endpunkt oder von GET an einen Endpunkt für Übermittlungen. Stimmen Sie die Methode auf die in der API-Dokumentation beschriebene Operation ab. Formularübermittlungen verwenden standardmäßig GET, sofern das Attribut method nicht auf post gesetzt ist.

Überprüfen Sie die Dokumentation des API-Endpunkts. REST-APIs legen pro Ressourcenpfad bestimmte Methoden fest. Vergewissern Sie sich, dass die Kombination aus Pfad und Methode gültig ist. Eine Abweichung beim abschließenden Schrägstrich zwischen /api/users und /api/users/ führt in vielen Frameworks zu unterschiedlichen Handlern, wobei der eine Pfad die Methode akzeptiert und der andere nicht.

Prüfen Sie die Serverkonfiguration auf Methodenbeschränkungen. Direktiven des Webservers schränken die erlaubten Methoden pro Location ein. In Apache steuern die Blöcke und den Zugriff nach Methode:

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

In nginx erreicht die Direktive limit_except dasselbe:

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

Passen Sie diese Direktiven an, um die beabsichtigte Methode zuzulassen.

Behandeln Sie CORS-Preflight-Anfragen. Cross-Origin-Anfragen lösen vor der eigentlichen Methode einen OPTIONS-Preflight aus. Der Server muss auf OPTIONS mit dem korrekten Header Access-Control-Allow-Methods antworten, der die zulässigen Methoden auflistet. Eine fehlende oder unvollständige CORS-Konfiguration gibt für den Preflight ein 405 zurück. In nginx:

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

Überprüfen Sie das Routing des Anwendungs-Frameworks. Web-Frameworks (Django, Rails, Express, Spring) registrieren Routen nur für ausdrücklich deklarierte Methoden. Ein fehlender Routen-Decorator oder eine fehlende Controller-Aktion für die angeforderte Methode führt zu 405. Vergewissern Sie sich, dass die Routendefinition zur beabsichtigten HTTP-Methode passt.

Achten Sie auf Störungen durch den Server für statische Dateien. nginx liefert standardmäßig statische Dateien aus und weist POST-Anfragen an statische Ressourcen zurück. Wenn POST für ein Anwendungs-Backend gedacht ist, prüfen Sie, ob der location-Block die Anfrage an die Upstream-Anwendung statt an den Handler für statische Dateien weiterleitet.

Code-Referenzen

.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