HTTP-Statuscodes
Jeder HTTP-Statuscode mit seiner Bedeutung und wann du ihn verwendest.
Über dieses Tool
Schlag jeden HTTP-Statuscode nach Nummer oder Name nach. Jeder hat eine einfache Beschreibung und einen Hinweis, wann du ihn zurückgeben solltest – hilfreich beim Entwerfen einer API oder beim Analysieren einer fehlgeschlagenen Anfrage.
So verwendest du es
- Gib einen Statuscode wie 404 oder ein Wort wie redirect oder rate limit ein.
- Nach Klasse filtern: 1xx Information, 2xx Erfolg, 3xx Weiterleitungen, 4xx Client-Fehler, 5xx Server-Fehler.
- Lies, was jeder Code bedeutet und wann du ihn zurückgibst.
Fragen
- Was ist der Unterschied zwischen 401 und 403?
- 401 bedeutet, dass der Client nicht authentifiziert ist, zum Beispiel weil das Token fehlt oder abgelaufen ist. 403 bedeutet, dass der Client authentifiziert ist, das aber nicht tun darf.
- Sollten Validierungsfehler 400 oder 422 zurückgeben?
- Beide werden verwendet. Eine verbreitete Konvention ist 400 für Anfragen, die sich nicht parsen lassen, und 422 für wohlgeformte Anfragen, deren Werte die Validierung nicht bestehen.
- Wann sollte ich 301 und wann 308 verwenden?
- Beides sind permanente Weiterleitungen. Bei 301 dürfen Browser aus einem POST ein GET machen; 308 garantiert, dass Methode und Body erhalten bleiben. Für einfache Seitenumzüge reicht 301.
- Was ist der Unterschied zwischen 502 und 504?
- Beide kommen von einem Proxy oder Load Balancer. 502 bedeutet, dass der Server dahinter eine ungültige Antwort geliefert hat oder abgestürzt ist; 504 bedeutet, dass er nicht rechtzeitig geantwortet hat.
- Was bedeutet der Statuscode 0?
- Das ist kein HTTP-Status. Browser melden 0, wenn keine Antwort beim Skript angekommen ist: Die Anfrage wurde durch CORS blockiert, abgebrochen, ist auf einen Netzwerk- oder DNS-Fehler gestoßen oder wurde als Mixed Content blockiert. Den wahren Grund findest du in der Browserkonsole und im Tab „Netzwerk“.
- Darf ich 404 statt 403 zurückgeben?
- Ja. RFC 9110 erlaubt einem Server, mit 404 zu antworten, wenn er jemandem, der eine Ressource nicht sehen darf, nicht verraten will, dass sie existiert. GitHub macht das bei privaten Repositorys. Nimm 403, wenn der Client wissen darf, dass die Ressource existiert, aber nicht darauf zugreifen darf.
- Welche Statuscodes sind standardmäßig cachebar?
- Nach RFC 9110 dürfen Antworten mit 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414 und 501 heuristisch gecacht werden, wenn kein Cache-Control- oder Expires-Header etwas anderes sagt. Ein CDN liefert also unter Umständen noch eine Weile einen 404 aus. Schick explizite Cache-Header, um das zu steuern.
Was sind HTTP-Statuscodes?
Jede HTTP-Antwort beginnt mit einem dreistelligen Statuscode, der dem Client sagt, wie die Anfrage gelaufen ist. Die Codes und ihre Bedeutungen sind in RFC 9110 definiert, einige weitere in anderen RFCs, etwa 429 Too Many Requests aus RFC 6585. Die erste Ziffer legt die Klasse fest: 1xx Information, 2xx Erfolg, 3xx Umleitung, 4xx Client-Fehler und 5xx Server-Fehler. Ein Client, der einen Code nicht kennt, behandelt ihn wie den x00-Code seiner Klasse.
Die meiste Software reagiert auf die Klasse. Browser folgen 3xx-Weiterleitungen, Retry-Logik wiederholt meist einige 5xx-Antworten, aber nie die meisten 4xx, und Monitoring zählt 5xx als Fehler auf deiner Seite. Die Reason-Phrase nach der Zahl, etwa „Not Found“, ist nur informativ, und HTTP/2 lässt sie ganz weg. Deshalb ist die richtige Zahl wichtiger als die Nachricht, die du mitschickst.
Welchen HTTP-Statuscode sollte meine API zurückgeben?
Fang mit den häufigen Fällen an. Gib 200 für ein erfolgreiches Lesen oder Aktualisieren mit Body zurück, 201 mit einem Location-Header, wenn ein POST etwas anlegt, und 204, wenn es nichts zurückzuschicken gibt, etwa nach einem DELETE. Nimm 202, wenn die Arbeit in eine Warteschlange kommt und später fertig wird. Vermeide 200 mit einer Fehlermeldung im Body: Clients, Caches und Monitoring-Tools vertrauen zuerst dem Statuscode.
Trenne bei Fehlern das Verschulden des Clients von deinem eigenen. Nimm 400 für fehlerhafte Eingaben, 404, wenn die Ressource nicht existiert, 409 für Konflikte wie eine doppelte E-Mail-Adresse und 429 mit einem Retry-After-Header für Rate Limits. Heb dir 5xx für Fehler auf der Serverseite auf und logge die Details, statt Stacktraces zurückzugeben. Ein einheitlicher Fehler-Body, etwa Problem Details nach RFC 9457, hilft Clients, sinnvolle Meldungen anzuzeigen.
Statuscode einer Anfrage prüfen: so geht’s
Öffne im Browser die Entwicklertools, wechsle zum Tab „Netzwerk“ und lade die Seite neu. Die Spalte „Status“ zeigt den Code jeder Anfrage, auch von fehlgeschlagenen fetch-Aufrufen aus Skripten. Auf der Kommandozeile gibt curl -i die Statuszeile und die Response-Header vor dem Body aus, curl -I schickt eine HEAD-Anfrage und zeigt nur die Header, und mit -L folgt curl Weiterleitungen, sodass du jede Station siehst.
Überrascht dich ein Code, finde heraus, wer ihn geschickt hat. Ein 502, 503 oder 504 kommt oft von nginx, einem Load Balancer oder einem CDN statt von deiner App, prüfe also den Server-Header und die Proxy-Logs. Ein 404 auf einer Route, die es nachweislich gibt, bedeutet meist einen falschen Basispfad oder ein Problem mit dem abschließenden Schrägstrich, während 405 bedeutet, dass der Pfad existiert, aber nicht für diese Methode. Der curl Converter hilft, die fehlschlagende Anfrage nachzubauen.
Alle HTTP-Statuscodes
Jeder Statuscode mit seiner Bedeutung und wann du ihn zurückgibst, nach Klassen gruppiert.
Information (1xx)
| Code | Name | Bedeutung | Wann verwenden |
|---|---|---|---|
| 100 | Continue | Der Server hat die Anfrage-Header erhalten; der Client soll den Body senden. | Wird automatisch gesendet, wenn ein Client mit Expect: 100-continue anfragt. |
| 101 | Switching Protocols | Der Server wechselt zu dem Protokoll, das der Client angefordert hat. | Beim Upgrade einer Verbindung auf WebSocket. |
| 103 | Early Hints | Vorläufige Header, damit der Browser mit dem Vorladen beginnen kann. | Link-Header für CSS und Schriften senden, während die Seite noch erstellt wird. |
Erfolg (2xx)
| Code | Name | Bedeutung | Wann verwenden |
|---|---|---|---|
| 200 | OK | Die Anfrage war erfolgreich. | Standard für ein erfolgreiches GET oder ein POST, das ein Ergebnis zurückgibt. |
| 201 | Created | Eine neue Ressource wurde erstellt. | Nach einem POST, der etwas erstellt. Gib einen Location-Header mit, der darauf zeigt. |
| 202 | Accepted | Die Anfrage wurde angenommen, aber noch nicht verarbeitet. | Eingereihte oder Hintergrund-Jobs. Gib eine Möglichkeit zurück, den Fortschritt zu prüfen. |
| 204 | No Content | Erfolg, ohne etwas zurückzusenden. | Ein DELETE oder PUT, das keinen Body zurückgibt. |
| 206 | Partial Content | Nur ein Teil der Ressource wird zurückgegeben. | Als Antwort auf eine Range-Anfrage, etwa für Video-Streaming oder fortsetzbare Downloads. |
Weiterleitung (3xx)
| Code | Name | Bedeutung | Wann verwenden |
|---|---|---|---|
| 301 | Moved Permanently | Die Ressource hat eine neue, dauerhafte URL. | Alte URLs nach einem Umbau der Website. Browser und Suchmaschinen merken sich das. |
| 302 | Found | Die Ressource liegt vorübergehend unter einer anderen URL. | Kurzzeitige Weiterleitungen. Clients dürfen POST in GET ändern; nimm lieber 303 oder 307, um eindeutig zu sein. |
| 303 | See Other | Hol das Ergebnis per GET von einer anderen URL. | Weiterleitung nach einem Formular-POST, damit ein Neuladen es nicht erneut absendet. |
| 304 | Not Modified | Die zwischengespeicherte Kopie ist noch gültig. | Als Antwort auf eine bedingte Anfrage mit If-None-Match oder If-Modified-Since. |
| 307 | Temporary Redirect | Wiederhole dieselbe Anfrage an einer anderen URL. | Temporäre Weiterleitung, die Methode und Body beibehalten muss. |
| 308 | Permanent Redirect | Wiederhole dieselbe Anfrage an einer neuen, dauerhaften URL. | Wie 301, aber Methode und Body dürfen sich nicht ändern. |
Client-Fehler (4xx)
| Code | Name | Bedeutung | Wann verwenden |
|---|---|---|---|
| 400 | Bad Request | Die Anfrage ist fehlerhaft oder ungültig. | Nicht parsebares JSON, fehlende Pflichtfelder, falsche Typen. |
| 401 | Unauthorized | Die Authentifizierung fehlt oder ist ungültig. | Kein Token oder ein abgelaufenes. Trotz des Namens bedeutet es „nicht authentifiziert“. |
| 402 | Payment Required | Reserviert; manche APIs nutzen ihn bei Abrechnungsproblemen. | Tariflimit erreicht oder Zahlung fehlgeschlagen. |
| 403 | Forbidden | Der Client ist bekannt, darf das aber nicht. | Angemeldet, aber ohne Berechtigung. |
| 404 | Not Found | Unter dieser URL existiert nichts. | Unbekannte Routen oder IDs. Wird auch genutzt, um Ressourcen zu verbergen, von denen der Client nichts wissen soll. |
| 405 | Method Not Allowed | Diese URL unterstützt diese HTTP-Methode nicht. | Ein POST an einen schreibgeschützten Endpunkt. Gib einen Allow-Header mit. |
| 406 | Not Acceptable | Keine Darstellung passt zum Accept-Header. | Der Client hat XML von einer API angefordert, die nur JSON liefert. |
| 408 | Request Timeout | Der Client hat zu lange gebraucht, um die Anfrage zu senden. | Inaktive Verbindungen. Clients können es gefahrlos erneut versuchen. |
| 409 | Conflict | Die Anfrage steht im Konflikt mit dem aktuellen Zustand. | Doppelte eindeutige Werte oder eine Änderung auf Basis einer veralteten Version. |
| 410 | Gone | Die Ressource existierte, wurde aber endgültig entfernt. | Gelöschte Inhalte oder eingestellte API-Versionen. Stärker als 404. |
| 411 | Length Required | Ein Content-Length-Header ist erforderlich. | Uploads ohne angegebene Größe. |
| 412 | Precondition Failed | Ein bedingter Header hat nicht gepasst. | If-Match mit einem veralteten ETag, um verlorene Updates zu verhindern. |
| 413 | Content Too Large | Der Anfrage-Body ist größer, als der Server akzeptiert. | Uploads über der Größengrenze. |
| 414 | URI Too Long | Die URL ist länger, als der Server verarbeitet. | Riesige Query-Strings. Verschiebe die Daten in einen POST-Body. |
| 415 | Unsupported Media Type | Das Format des Bodys wird nicht unterstützt. | Formulardaten an einen JSON-Endpunkt gesendet oder ein falscher Content-Type. |
| 416 | Range Not Satisfiable | Der angeforderte Byte-Bereich liegt außerhalb der Datei. | Eine Range-Anfrage über das Ende der Ressource hinaus. |
| 418 | I’m a teapot | Ein Aprilscherz von 1998, der sich gehalten hat. | Nur für Easter Eggs. |
| 422 | Unprocessable Content | Die Anfrage ist wohlgeformt, besteht aber die Validierung nicht. | Gültiges JSON mit ungültigen Werten, etwa einem Enddatum vor dem Startdatum. |
| 423 | Locked | Die Ressource ist gesperrt. | WebDAV oder ein Datensatz, der gerade von jemand anderem bearbeitet wird. |
| 425 | Too Early | Der Server riskiert nicht, eine Anfrage zu verarbeiten, die wiederholt eingespielt werden könnte. | TLS Early Data (0-RTT). |
| 426 | Upgrade Required | Der Client muss zu einem anderen Protokoll wechseln. | Erzwingt eine neuere TLS- oder HTTP-Version. |
| 428 | Precondition Required | Die Anfrage muss bedingt sein. | Wenn bei Updates If-Match verlangt wird, um verlorene Schreibvorgänge zu vermeiden. |
| 429 | Too Many Requests | Der Client sendet Anfragen zu schnell. | Rate Limiting. Gib einen Retry-After-Header mit. |
| 431 | Request Header Fields Too Large | Die Header sind zu groß. | Übergroße Cookies sind meist der Grund. |
| 451 | Unavailable For Legal Reasons | Aus rechtlichen Gründen gesperrt. | Inhalte, die per Gerichtsbeschluss entfernt oder in einem Land gesperrt wurden. |
Server-Fehler (5xx)
| Code | Name | Bedeutung | Wann verwenden |
|---|---|---|---|
| 500 | Internal Server Error | Auf dem Server ist etwas schiefgelaufen. | Unbehandelte Ausnahmen. Protokolliere die Details, gib sie nicht an den Client weiter. |
| 501 | Not Implemented | Der Server unterstützt diese Funktion nicht. | Eine HTTP-Methode, die der Server überhaupt nicht kennt. |
| 502 | Bad Gateway | Ein Proxy hat eine ungültige Antwort vom Server dahinter erhalten. | Die App hinter nginx oder einem Load Balancer ist abgestürzt oder hat Unsinn geliefert. |
| 503 | Service Unavailable | Der Server kann gerade keine Anfragen verarbeiten. | Wartung oder Überlastung. Gib Retry-After mit, wenn du weißt, wann der Dienst wieder da ist. |
| 504 | Gateway Timeout | Ein Proxy hat nicht rechtzeitig eine Antwort erhalten. | Die dahinterliegende App ist zu langsam oder hängt. |
| 505 | HTTP Version Not Supported | Die HTTP-Version wird nicht unterstützt. | Selten; sehr alte oder sehr neue Protokollversionen. |
| 507 | Insufficient Storage | Der Server hat keinen Platz, um das Ergebnis zu speichern. | Festplatte voll oder ein Speicherkontingent erreicht. |
| 508 | Loop Detected | Der Server hat bei der Verarbeitung eine Endlosschleife gefunden. | WebDAV oder eine Weiterleitungs- bzw. Proxy-Schleife. |
| 511 | Network Authentication Required | Der Client muss sich anmelden, um Netzwerkzugang zu erhalten. | Captive Portals in Hotel- und Flughafen-WLANs. |
Funktioniert etwas nicht, oder sieht ein Ergebnis falsch aus? Ein Problem mit diesem Tool melden