HTTP-Statuscodes

Eine durchsuchbare Tabelle jedes registrierten HTTP-Statuscodes, seiner exakten Reason-Phrase und des RFC-Abschnitts, der ihn definiert. Filter nach 1xx- bis 5xx-Klasse.

Was bedeutet dieser Antwortcode eigentlich? Gib eine Zahl wie 429 oder ein Wort wie gateway ein, um die Tabelle zu filtern, oder grenze sie auf eine einzelne Klasse ein. Jede Zeile zeigt den Code, die exakte Reason-Phrase, die über die Leitung geht, und den Spezifikationsabschnitt, der sie definiert.

Passende Codes
Code Reason-Phrase Definiert in

HTTP-Statuscodes richtig lesen

Die Klassenziffer trägt den Vertrag

Jede HTTP-Antwort beginnt mit einem dreistelligen Code, und die erste Ziffer ist der einzige Teil, den ein Client verstehen muss. RFC 9110 ist da explizit: Ein Client, der einen unbekannten 499 erhält, muss ihn genau wie einen 400 behandeln, weil die Klasse die Semantik festlegt und die übrigen zwei Ziffern sie nur verfeinern. Diese Regel hält das Protokoll erweiterbar. Ein 2005 geschriebener Proxy kann einen 451 korrekt weiterleiten, ohne zu wissen, was rechtliche Zensur ist.

Die fünf Klassen teilen sauber auf, wer für das Weitere verantwortlich ist. Ein 1xx ist eine Zwischenantwort, also kommt die echte Antwort noch und die Verbindung bleibt offen. Ein 2xx bedeutet, die Anfrage war erfolgreich und der Client kann stoppen. Ein 3xx gibt eine Umleitung zurück, also sollte der Client es woanders erneut versuchen. Ein 4xx gibt der Anfrage die Schuld, also wird sie unverändert wiederholt erneut fehlschlagen. Ein 5xx gibt dem Server die Schuld, also könnte die identische Anfrage beim Wiederholen gelingen. Deshalb knüpft Retry-Logik an die Klasse und nicht an den konkreten Code: Ein 503 erneut zu versuchen ist vernünftig, ein 403 ein Bug.

Codes, die regelmäßig verwechselt werden

Der Unterschied zwischen 301 und 308 oder 302 und 307 ist nicht stilistisch. Das ältere Paar erlaubt einem Client, beim Folgen der Umleitung ein POST in ein GET umzuschreiben, was Browser historisch getan haben. Das neuere Paar verbietet dieses Umschreiben und bewahrt sowohl Methode als auch Body. Wenn du einen Formular-Endpunkt mit 301 verschiebst, werden manche Clients die Übermittlung stillschweigend in ein GET umwandeln und die Nutzlast fallen lassen. Verwende 308 oder 307 für alles, was nicht idempotent ist.

401 und 403 werden ähnlich verwechselt. Eine 401 bedeutet, die Anfrage war nicht authentifiziert und muss mit einer WWW-Authenticate-Herausforderung eintreffen, die dem Client sagt, wie er es mit Anmeldedaten erneut versucht. Eine 403 bedeutet, der Server wusste, wer du bist, und weigert sich dennoch. Eine 401 ohne Challenge-Header zu senden verletzt die Spezifikation, und eine 403 zu senden, wenn der Nutzer schlicht vergessen hat, sich einzuloggen, macht den Fehler viel schwerer zu debuggen.

Die 4xx-Klasse enthält auch ein wirklich nützliches Paar: 400 gegenüber 422. Eine 400 bedeutet, die Anfrage ließ sich gar nicht parsen, also ist die Syntax kaputt. Eine 422 bedeutet, die Syntax wurde fehlerfrei geparst, aber der Inhalt bestand die Validierung nicht. Diese Trennung verwandelt ein undurchsichtiges Fehlschlagen in ein handhabbares für API-Clients.

Reason-Phrasen sind nur für Menschen

Der Text neben dem Code, wie Not Found oder I'm a teapot, ist die Reason-Phrase. HTTP/1.1 sendet sie in der Statuszeile, aber HTTP/2 und HTTP/3 entfernten sie ganz, also trägt eine moderne Verbindung oft die Zahl ohne Phrase überhaupt. Nichts in einem Client darf je auf dieser Zeichenfolge verzweigen. Sie existiert, damit ein Mensch, der ein Protokoll oder eine Roh-Ablaufverfolgung liest, ohne Nachschlagetabelle sieht, was geschah.

Manche Codes sind zudem stärker eingeschränkt, als sie wirken. Eine 204 und eine 304 dürfen keinen Nachrichten-Body enthalten, also erzeugt ein Vermittler, der einen hinzufügt, eine ungültige Antwort. Eine HEAD-Antwort trägt unabhängig vom Code nie einen Body. Diese Rahmenregeln zählen, weil ein Body, wo keiner erwartet wird, die Wiederverwendung der Verbindung desynchronisiert, was sich als bizarre überkreuzte Korruption statt als offensichtlicher Fehler zeigt.

Open-Source-Hinweis: in Vanilla-JavaScript implementiert ohne Drittanbieter-Bibliotheken.

FAQ

Wie viele HTTP-Statuscodes gibt es?
IANA listet knapp über sechzig registrierte Codes über die fünf Klassen hinweg, und diese Tabelle deckt alle plus ein paar weit verbreitete WebDAV- und Erweiterungscodes ab. Das Register ist absichtlich offen, sodass neue Codes hinzugefügt werden können, was genau der Grund ist, warum Clients für alles Unbekannte auf die Klassenziffer zurückfallen müssen.
Sollte ich 301 oder 308 für eine dauerhafte Umleitung verwenden?
Verwende 308, es sei denn, du willst ausdrücklich, dass alte Clients POST in GET umwandeln. Beide bedeuten, die Ressource wurde dauerhaft verschoben, aber nur 308 garantiert, dass Methode und Body die Umleitung überstehen. Für eine einfache Seitenverschiebung funktioniert beides, und 301 hat etwas breitere Altsystem-Unterstützung.
Was ist der Unterschied zwischen 401 und 403?
Eine 401 bedeutet, du warst nicht authentifiziert, und die Antwort muss einen WWW-Authenticate-Header enthalten, der beschreibt, wie. Eine 403 bedeutet, du warst einwandfrei authentifiziert und bist trotzdem nicht erlaubt. Wenn ein Nutzer sich nur anmelden muss, ist 401 korrekt; wenn sein Konto schlicht die Berechtigung fehlt, ist 403 korrekt.
Ist 418 I'm a teapot ein echter Statuscode?
Er ist insofern echt, als RFC 2324 ihn für das Hyper Text Coffee Pot Control Protocol definiert, eine Aprilscherz-Spezifikation von 1998. IANA hält ihn reserviert, damit sonst nichts 418 beanspruchen kann. Er gehört nicht zu HTTP im engeren Sinne, aber mehrere Frameworks implementieren ihn als Easter Egg.
Welche Codes sollte mein Client automatisch erneut versuchen?
Wiederhole bei 408, 429 und den meisten 5xx-Antworten, und respektiere immer einen Retry-After-Header, wenn einer vorhanden ist. Wiederhole keine 4xx-Codes außer 408 und 429, denn die Anfrage selbst ist das Problem und unverändert wiederholt wird sie identisch fehlschlagen.
Warum hat meine HTTP/2-Antwort keine Reason-Phrase?
HTTP/2 und HTTP/3 strichen die Reason-Phrase aus dem Wire-Format, weil kein Client sie parsen sollte. Nur der numerische Code wird übertragen. Werkzeuge, die zu einer HTTP/2-Antwort eine Phrase anzeigen, schlagen sie lokal aus einer Tabelle wie dieser nach.