HTTP 405 Method Not Allowed: Was es bedeutet und wie du es behebst
HTTP 405 Method Not Allowed
HTTP 405 Method Not Allowed: Ursachen, Allow-Header, Lösungen | We.Inc
Warum ein Server 405 antwortet, welchen Allow-Header er senden muss und wie du es in Flask, Express und Next.js behebst. Baue die richtige 405-Antwort für deine eigene Route.
Ein 405 Method Not Allowed bedeutet, dass die URL existiert, aber die verwendete HTTP-Methode nicht akzeptiert, zum Beispiel ein POST an eine Route, die nur GET verarbeitet. Der Server muss die Methoden, die er akzeptiert, in einem Allow-Header auflisten. Sende eine davon oder füge auf dem Server einen Handler für deine Methode hinzu.
405 im Vergleich mit seinen Nachbarn
Status
Bedeutung
Typische Lösung
405 Method Not Allowed
Die Ressource existiert; diese Methode wird für sie nicht akzeptiert
Eine Methode aus Allow nutzen oder einen Handler hinzufügen
404 Not Found
Keine Ressource unter dieser URL
Den Pfad korrigieren
501 Not Implemented
Der Server unterstützt die Methode überhaupt nicht
Eine Standardmethode nutzen
403 Forbidden
Die Methode passt, dir fehlt die Berechtigung
Zugriff besorgen oder Konto wechseln
Hake die Methoden an, die deine Route verarbeitet, wähle die Methode, die ein Client sendet, und der Builder zeigt die genaue Antwort, die der Server zurückgeben sollte: einen normalen Erfolg oder ein 405 mit einem Allow-Header, der die Methoden in der Reihenfolge enthält, in der du sie angehakt hast.
Hake jede Methode an, die deine Route wirklich verarbeitet.
Wähle die Methode, die die fehlschlagende Anfrage verwendet. Der Network-Tab deines Browsers zeigt sie.
Lies die Antwort. Ein 405 muss Allow mit jeder angehakten Methode enthalten.
Kopiere unten die Lösung, die zu deinem Framework passt.
Prüfe zuerst den Allow-Header in der fehlschlagenden Antwort. Er sagt dir, welche Methoden der Server annimmt, und verrät oft ein Formular, das die falsche nutzt.
Ein Formular ohne method-Attribut sendet per GET. Nimmt dein Handler nur POST an, füge dem Formular method="post" hinzu.
Ein abschließender Schrägstrich oder eine Weiterleitung kann unterwegs aus einem POST ein GET machen, das dann auf einer reinen POST-Route landet. Sieh dir jeden Schritt im Network-Tab an.
Wenn du den Server schreibst, gib für einen bekannten Pfad mit falscher Methode 405 mit Allow statt 404 zurück. Clients und API-Tools können den Fehler dann erklären.
Häufige Fragen
Ist 405 ein Problem des Clients oder des Servers?
Es ist ein 4xx-Code, der Server beanstandet also die Anfrage. Entweder sollte der Client eine andere Methode nutzen, oder der Betreiber des Servers sollte Unterstützung für die gesendete Methode hinzufügen.
Muss eine 405-Antwort den Allow-Header enthalten?
Ja. RFC 9110 sagt, dass der Server ein Allow-Header-Feld erzeugen muss, das die Methoden auflistet, die die Ressource aktuell unterstützt. Eine leere Liste ist erlaubt, wenn die Ressource gar keine Methoden annimmt.
Warum bekomme ich 405, wenn ich ein Formular absende?
Meist sendet das Formular eine Methode, die die Route nicht akzeptiert. Eine Route in Flask zum Beispiel antwortet nur auf GET, bis du dem Route-Decorator methods=["GET", "POST"] übergibst.
Warum gibt Express mir 404 statt 405?
Express behandelt eine nicht passende Methode genauso wie einen nicht passenden Pfad: Keine Route hat geantwortet, also fällt die Anfrage zum 404-Handler durch. Füge mit app.all einen Catch für den Pfad hinzu, um selbst 405 zu senden.
Was ist der Unterschied zwischen 405 und 501?
405 bedeutet, dass diese Ressource eine Methode ablehnt, die der Server versteht. 501 bedeutet, dass der Server die Methode für keine Ressource unterstützt.
Die Regel in der Spezifikation
Der Origin-Server erkennt die Methode, aber die Zielressource unterstützt sie nicht. Weil der Server weiß, welche Methoden funktionieren würden, verlangt die Spezifikation, dass er das über Allow mitteilt. Ein 405 ohne Allow ist unvollständig.
Woher ein 405 meistens kommt
Framework-Routen, die für eine einzige Methode registriert sind, API-Gateways, die jede Methode einzeln zuordnen, und statische Dateiserver, die Dateien ausliefern, aber keine Schreibzugriffe annehmen, sind die üblichen Quellen. In jedem Fall passte der Pfad, die Methode aber nicht.
Route Handler in Next.js exportieren eine Funktion pro Methode. Die unterstützten Namen sind GET, POST, PUT, PATCH, DELETE, HEAD und OPTIONS, und wenn du OPTIONS nicht exportierst, beantwortet Next.js es für dich mit einem Allow-Header, der aus den exportierten Methoden gebildet wird.
Lösungen pro Stack
Flask: jede Methode deklarieren, die die Route annimmt
Ohne methods= antwortet die Route nur auf GET (Flask fügt HEAD und OPTIONS automatisch hinzu).
Express: ein echtes 405 senden, statt zu 404 durchzufallen
app.all nach den echten Handlern fängt jede andere Methode für denselben Pfad ab.
Next.js Route Handler: die Methode exportieren, die du aufrufst
app/api/items/route.ts. Eine Anfrage mit einer Methode, die du nicht exportiert hast, kann deinen Code nicht erreichen.
HTML: dem Formular die Methode geben, die der Server erwartet
Ein Formular ohne method-Attribut sendet per GET.
Builder für 405-Antworten
Methoden, die diese Route verarbeitet
Methode, die der Client sendet
Was der Server zurücksenden sollte
Die Methode wird unterstützt, ein 405 ist also nicht im Spiel.
Die Methode steht nicht in der Liste, die Antwort ist also 405 mit einem Allow-Header, der die {n} angehakten Methoden nennt.