# HTTP-Statuscodes — Vollständige Referenz nach RFC 9110

> Referenz aller HTTP-Statuscodes (1xx–5xx) nach RFC 9110 — Bedeutung, Einsatz und typische Fälle für APIs, SEO und Debugging.

Source: https://www.jpkc.com/db/cheatsheets/networking/http-status/

<!-- PROSE:intro -->
HTTP-Statuscodes sind die Sprache zwischen Client und Server: Ein dreistelliger Code zeigt auf einen Blick, ob deine Anfrage erfolgreich war, weitergeleitet wurde oder gescheitert ist. Die fünf Klassen reichen von 1xx (Informationell) über 2xx (Erfolg) und 3xx (Weiterleitungen) bis 4xx (Client-Fehler) und 5xx (Server-Fehler). Diese Referenz deckt alle standardisierten Codes nach RFC 9110 ab – plus plattformspezifische Erweiterungen von Nginx, IIS und Cloudflare – und hilft dir beim API-Design, SEO-Monitoring und Debugging.
<!-- PROSE:intro:end -->

## 1xx — Informationell

`100 Continue` — Der Server hat die Anfrage-Header erhalten. Der Client kann den Body senden.

```bash
Client sends Expect: 100-continue header, server responds 100 before the body is sent.
```

`101 Switching Protocols` — Der Server wechselt das Protokoll gemäß dem `Upgrade`-Header des Clients.

```bash
HTTP → WebSocket upgrade: client sends Upgrade: websocket, server responds 101.
```

`102 Processing (WebDAV)` — Der Server hat die Anfrage empfangen und verarbeitet sie, aber es liegt noch keine Antwort vor.

```bash
Long-running WebDAV operation to prevent the client from timing out.
```

`103 Early Hints` — Sendet vorläufige Antwort-Header vor der endgültigen Antwort. Wird zum Vorladen von Ressourcen genutzt.

```bash
Server sends Link: </style.css>; rel=preload so the browser can start loading assets early.
```

## 2xx — Erfolg

`200 OK` — Die Anfrage war erfolgreich. Die Standardantwort für erfolgreiche HTTP-Requests.

```bash
GET /api/users → 200 with JSON body containing user list.
```

`201 Created` — Die Anfrage war erfolgreich und eine neue Ressource wurde erstellt. Sollte einen `Location`-Header enthalten.

```bash
POST /api/users → 201 with Location: /api/users/42 header.
```

`202 Accepted` — Die Anfrage wurde zur Verarbeitung akzeptiert, aber die Verarbeitung ist noch nicht abgeschlossen.

```bash
POST /api/reports/generate → 202 (report will be generated asynchronously).
```

`203 Non-Authoritative Information` — Die Antwort kommt von einem transformierenden Proxy. Der ursprüngliche Server hat 200 zurückgegeben, der Proxy hat sie jedoch modifiziert.

```bash
A proxy modifies response headers or body before forwarding to the client.
```

`204 No Content` — Die Anfrage war erfolgreich, aber es gibt keinen Inhalt zurückzugeben. Der Client soll nicht navigieren.

```bash
DELETE /api/users/42 → 204 (deleted successfully, no body needed).
```

`205 Reset Content` — Die Anfrage war erfolgreich. Der Client soll die Dokumentansicht zurücksetzen (z. B. ein Formular leeren).

```bash
POST /api/form-submit → 205 (tells the browser to reset the form fields).
```

`206 Partial Content` — Der Server liefert aufgrund eines `Range`-Headers des Clients nur einen Teil der Ressource zurück.

```bash
GET /video.mp4 with Range: bytes=0-1023 → 206 with the first 1024 bytes.
```

`207 Multi-Status (WebDAV)` — Der Antwort-Body enthält Statusinformationen für mehrere Unter-Anfragen (XML-Body).

```bash
WebDAV PROPFIND on a collection returns 207 with per-resource status.
```

`208 Already Reported (WebDAV)` — Mitglieder einer DAV-Bindung wurden bereits in einem früheren Teil der Antwort aufgelistet.

```bash
Avoids redundant enumeration of internal members in a WebDAV binding.
```

`226 IM Used` — Der Server hat einen GET-Request mit Instance-Manipulationen an der aktuellen Instanz erfüllt.

```bash
Delta encoding: server returns the diff between the cached and current version.
```

## 3xx — Weiterleitungen

`300 Multiple Choices` — Die Anfrage hat mehrere mögliche Antworten. Der Client soll eine davon auswählen.

```bash
A resource available in multiple formats (HTML, JSON, XML) with no preferred one.
```

`301 Moved Permanently` — Die Ressource wurde dauerhaft an eine neue URL verschoben. Suchmaschinen aktualisieren ihre Links.

```bash
GET /old-page → 301 Location: /new-page (browsers and crawlers follow permanently).
```

`302 Found` — Die Ressource befindet sich vorübergehend unter einer anderen URL. Der Client soll weiterhin die ursprüngliche URL verwenden.

```bash
GET /dashboard → 302 Location: /login (temporarily redirect to login page).
```

`303 See Other` — Die Antwort zur Anfrage ist unter einer anderen URL per GET abrufbar. Wird häufig nach einem POST verwendet.

```bash
POST /api/orders → 303 Location: /api/orders/42 (redirect to the created resource via GET).
```

`304 Not Modified` — Die Ressource hat sich seit der im `If-Modified-Since`- oder `If-None-Match`-Header angegebenen Version nicht geändert.

```bash
GET /style.css with If-None-Match: "abc" → 304 (use your cached version).
```

`305 Use Proxy (Deprecated)` — Auf die angeforderte Ressource muss über den in `Location` angegebenen Proxy zugegriffen werden.

```bash
Deprecated due to security concerns. Not used in modern HTTP.
```

`307 Temporary Redirect` — Wie 302, garantiert aber, dass die HTTP-Methode nicht geändert wird (POST bleibt POST).

```bash
POST /api/submit → 307 Location: /api/v2/submit (POST is preserved).
```

`308 Permanent Redirect` — Wie 301, garantiert aber, dass die HTTP-Methode nicht geändert wird (POST bleibt POST).

```bash
POST /api/old-endpoint → 308 Location: /api/new-endpoint (permanent, method preserved).
```

## 4xx — Client-Fehler (Allgemein)

`400 Bad Request` — Der Server kann die Anfrage aufgrund fehlerhafter Syntax oder ungültiger Parameter nicht verarbeiten.

```bash
POST /api/users with invalid JSON body → 400 {"error": "Invalid JSON"}.
```

`401 Unauthorized` — Authentifizierung ist erforderlich und fehlgeschlagen oder wurde nicht angegeben.

```bash
GET /api/profile without an Authorization header → 401.
```

`402 Payment Required` — Für zukünftige Verwendung reserviert. Manche APIs nutzen ihn, um auf eine erforderliche Zahlung oder ein fehlendes Abonnement hinzuweisen.

```bash
API rate limit exceeded on a paid plan → 402 (non-standard usage).
```

`403 Forbidden` — Der Server hat die Anfrage verstanden, verweigert aber die Autorisierung. Authentifizierung hilft hier nicht.

```bash
GET /admin/settings as a non-admin user → 403 (authenticated but not permitted).
```

`404 Not Found` — Die angeforderte Ressource konnte auf dem Server nicht gefunden werden.

```bash
GET /api/users/99999 → 404 (user does not exist).
```

`405 Method Not Allowed` — Die HTTP-Methode wird für diese Ressource nicht unterstützt. Muss einen `Allow`-Header enthalten.

```bash
DELETE /api/users → 405 Allow: GET, POST (delete not supported on collection).
```

`406 Not Acceptable` — Der Server kann keine Antwort erstellen, die den `Accept`-Headern des Clients entspricht.

```bash
GET /api/data with Accept: application/xml but server only supports JSON → 406.
```

`407 Proxy Authentication Required` — Der Client muss sich beim Proxy authentifizieren, bevor die Anfrage fortgesetzt werden kann.

```bash
Request through a corporate proxy that requires credentials → 407.
```

`408 Request Timeout` — Der Server hat zu lange auf den Client gewartet, bis die Anfrage vollständig gesendet wurde.

```bash
Client opens a connection but sends data too slowly → 408.
```

`409 Conflict` — Die Anfrage steht im Konflikt mit dem aktuellen Zustand der Ressource.

```bash
PUT /api/users/42 with a stale ETag → 409 (concurrent modification conflict).
```

## 4xx — Client-Fehler (Inhalt & Rate Limits)

`410 Gone` — Die Ressource existierte früher, wurde aber dauerhaft entfernt. Anders als 404 ist das beabsichtigt und permanent.

```bash
GET /api/v1/users → 410 (API v1 has been retired, use v2).
```

`411 Length Required` — Der Server erfordert einen `Content-Length`-Header, der nicht angegeben wurde.

```bash
POST /api/upload without Content-Length → 411.
```

`412 Precondition Failed` — Eine Vorbedingung im Anfrage-Header (`If-Match`, `If-Unmodified-Since`) wurde nicht erfüllt.

```bash
PUT /api/doc/42 with If-Match: "old-etag" but resource has changed → 412.
```

`413 Content Too Large` — Der Anfrage-Body überschreitet das Größenlimit des Servers.

```bash
POST /api/upload with a 500MB file but server limit is 100MB → 413.
```

`414 URI Too Long` — Die Anfrage-URI ist länger als der Server bereit ist zu verarbeiten.

```bash
GET request with extremely long query string exceeding server limits → 414.
```

`415 Unsupported Media Type` — Der Media-Type des Anfrage-Bodys wird vom Server nicht unterstützt.

```bash
POST /api/users with Content-Type: text/plain but server requires application/json → 415.
```

`416 Range Not Satisfiable` — Der `Range`-Header-Wert liegt außerhalb der Grenzen der Ressource.

```bash
GET /file.pdf with Range: bytes=9999999-  but file is only 1MB → 416.
```

`417 Expectation Failed` — Der Server kann die Anforderungen des `Expect`-Headers nicht erfüllen.

```bash
Client sends Expect: 100-continue but server doesn't support it → 417.
```

`418 I'm a Teapot (RFC 2324)` — Aprilscherz aus dem Hyper Text Coffee Pot Control Protocol. In der Produktion nicht zu erwarten.

```bash
BREW /coffee on a teapot → 418 (the server refuses because it's a teapot).
```

`422 Unprocessable Content` — Die Anfrage ist syntaktisch korrekt, aber semantisch ungültig. Häufig bei Validierungsfehlern.

```bash
POST /api/users with {"email": "not-an-email"} → 422 with validation errors.
```

`429 Too Many Requests` — Der Client hat in einem bestimmten Zeitraum zu viele Anfragen gesendet (Rate Limiting).

```bash
API returns 429 with Retry-After: 60 header after exceeding 100 requests/minute.
```

## 4xx — Client-Fehler (Sicherheit & Protokoll)

`421 Misdirected Request` — Die Anfrage wurde an einen Server gerichtet, der keine Antwort liefern kann (z. B. falsches TLS-Zertifikat).

```bash
HTTP/2 connection reuse to a server that doesn't handle the requested host → 421.
```

`423 Locked (WebDAV)` — Die Ressource ist gesperrt und kann nicht geändert werden.

```bash
PUT /document.docx → 423 (file is locked by another user in WebDAV).
```

`424 Failed Dependency (WebDAV)` — Die Anfrage ist fehlgeschlagen, weil sie von einer anderen Anfrage abhing, die ebenfalls fehlgeschlagen ist.

```bash
Batch WebDAV operation where a prerequisite step failed → 424.
```

`425 Too Early` — Der Server verweigert die Verarbeitung einer Anfrage, die möglicherweise wiederholt werden könnte (TLS 1.3 Early Data Risiko).

```bash
Request sent in TLS 1.3 0-RTT early data that the server won't risk replaying → 425.
```

`426 Upgrade Required` — Der Server verlangt, dass der Client auf ein anderes Protokoll wechselt.

```bash
Server requires TLS: responds 426 with Upgrade: TLS/1.3 header.
```

`428 Precondition Required` — Der Server verlangt, dass die Anfrage konditional ist (z. B. `If-Match`-Header), um verlorene Updates zu verhindern.

```bash
PUT /api/doc without If-Match header → 428 (server enforces optimistic locking).
```

`431 Request Header Fields Too Large` — Die Anfrage-Header sind zu groß für den Server.

```bash
Request with oversized cookies or too many headers → 431.
```

`451 Unavailable For Legal Reasons` — Die Ressource ist aus rechtlichen Gründen nicht verfügbar (Zensur, Gerichtsbeschluss, DSGVO).

```bash
GET /blocked-content → 451 (content restricted by government order).
```

## 5xx — Server-Fehler

`500 Internal Server Error` — Ein generischer serverseitiger Fehler. Der Server ist auf eine unerwartete Bedingung gestoßen.

```bash
Unhandled exception in application code → 500.
```

`501 Not Implemented` — Der Server unterstützt die zur Erfüllung der Anfrage benötigte Funktionalität nicht.

```bash
PATCH /api/resource but the server has no PATCH handler → 501.
```

`502 Bad Gateway` — Der als Gateway agierende Server hat eine ungültige Antwort vom vorgelagerten Server erhalten.

```bash
Nginx reverse proxy cannot reach the PHP-FPM backend → 502.
```

`503 Service Unavailable` — Der Server ist vorübergehend nicht in der Lage, die Anfrage zu bearbeiten (überlastet oder in Wartung).

```bash
Server in maintenance mode → 503 with Retry-After: 3600 header.
```

`504 Gateway Timeout` — Der als Gateway agierende Server hat keine rechtzeitige Antwort vom vorgelagerten Server erhalten.

```bash
Nginx proxy_read_timeout exceeded waiting for a slow backend → 504.
```

`505 HTTP Version Not Supported` — Der Server unterstützt die in der Anfrage verwendete HTTP-Version nicht.

```bash
Client sends HTTP/3 request to a server that only supports HTTP/1.1 → 505.
```

`506 Variant Also Negotiates` — Der Server hat einen internen Konfigurationsfehler bei der transparenten Inhaltsverhandlung.

```bash
Circular reference in content negotiation configuration → 506.
```

`507 Insufficient Storage (WebDAV)` — Der Server kann die zur Erfüllung der Anfrage benötigte Darstellung nicht speichern.

```bash
WebDAV PUT when the server's disk is full → 507.
```

`508 Loop Detected (WebDAV)` — Der Server hat bei der Verarbeitung der Anfrage eine Endlosschleife erkannt.

```bash
WebDAV PROPFIND encounters a circular symbolic link → 508.
```

`510 Not Extended` — Der Server benötigt weitere Erweiterungen der Anfrage, um sie zu erfüllen.

```bash
Request lacks a required extension declaration → 510.
```

`511 Network Authentication Required` — Der Client muss sich authentifizieren, um Netzwerkzugang zu erhalten (Captive Portal).

```bash
Public Wi-Fi hotspot intercepts requests and returns 511 with a login page.
```

## Inoffizielle & plattformspezifische Codes

`440 Login Time-out (IIS)` — Microsoft IIS: Die Sitzung des Clients ist abgelaufen, er muss sich neu anmelden.

```bash
IIS returns 440 when an authenticated session times out.
```

`444 No Response (Nginx)` — Nginx schließt die Verbindung, ohne eine Antwort zu senden. Wird zum Blockieren bösartiger Anfragen genutzt.

```bash
Nginx config: return 444; to silently drop requests from bad bots.
```

`494 Request Header Too Large (Nginx)` — Nginx: Der Anfrage-Header oder die URI ist zu groß zur Verarbeitung.

```bash
Client sends oversized cookies exceeding large_client_header_buffers → 494.
```

`495 SSL Certificate Error (Nginx)` — Nginx: Die SSL-Zertifikats-Validierung des Clients ist fehlgeschlagen.

```bash
Client presents an expired or untrusted client certificate → 495.
```

`496 SSL Certificate Required (Nginx)` — Nginx: Ein Client-Zertifikat ist erforderlich, wurde aber nicht angegeben.

```bash
Request to an endpoint requiring mTLS without a client certificate → 496.
```

`497 HTTP Request Sent to HTTPS Port (Nginx)` — Nginx: Eine einfache HTTP-Anfrage wurde an einen HTTPS-only-Port gesendet.

```bash
Client sends http:// request to port 443 → 497.
```

`499 Client Closed Request (Nginx)` — Nginx: Der Client hat die Verbindung geschlossen, bevor der Server eine Antwort senden konnte.

```bash
User navigates away or client times out before server finishes processing → 499.
```

`520 Web Server Returned an Unknown Error (Cloudflare)` — Cloudflare: Der Origin-Server hat eine unerwartete oder leere Antwort zurückgegeben.

```bash
Origin sends an invalid HTTP response that Cloudflare cannot interpret → 520.
```

`521 Web Server Is Down (Cloudflare)` — Cloudflare: Der Origin-Server hat die Verbindung verweigert.

```bash
Origin web server is not running or blocking Cloudflare IPs → 521.
```

`522 Connection Timed Out (Cloudflare)` — Cloudflare: Die TCP-Verbindung zum Origin-Server ist abgelaufen.

```bash
Origin server is overloaded or a firewall is dropping packets → 522.
```

`523 Origin Is Unreachable (Cloudflare)` — Cloudflare: Die DNS-Auflösung war erfolgreich, aber der Origin-Server ist nicht erreichbar.

```bash
DNS points to a server that is down or has no route → 523.
```

`524 A Timeout Occurred (Cloudflare)` — Cloudflare: Die TCP-Verbindung wurde hergestellt, aber der Origin-Server hat nicht rechtzeitig geantwortet.

```bash
Origin accepts connection but a slow backend exceeds Cloudflare's 100s timeout → 524.
```

`525 SSL Handshake Failed (Cloudflare)` — Cloudflare: Der SSL/TLS-Handshake mit dem Origin-Server ist fehlgeschlagen.

```bash
Origin has an expired certificate or SSL misconfiguration → 525.
```

`526 Invalid SSL Certificate (Cloudflare)` — Cloudflare: Das SSL-Zertifikat des Origin-Servers kann nicht validiert werden.

```bash
Origin uses a self-signed certificate with Full (Strict) SSL mode → 526.
```

`530 (Cloudflare)` — Cloudflare: Wird zusammen mit einem 1xxx-Fehler zurückgegeben. Weist normalerweise auf ein Cloudflare-spezifisches Problem hin.

```bash
Cloudflare returns 530 wrapping an internal 1020 (Access Denied) error.
```

<!-- PROSE:outro -->
## Fazit

HTTP-Statuscodes sind kein nettes Detail – sie sind das Rückgrat jeder Webkommunikation. Mit dieser Referenz findest du schnell den richtigen Code für dein API-Design, erkennst Fehlerquellen beim Debugging und verstehst, warum Suchmaschinen auf 301 und 404 anders reagieren als auf 200 und 410.

## Weiterführende Links

- [HTTP-Statuscodes — MDN Web Docs](https://developer.mozilla.org/de/docs/Web/HTTP/Status) — alle Codes mit Beschreibungen und Kompatibilitätstabellen
- [HTTP-Statuscode — Wikipedia](https://de.wikipedia.org/wiki/HTTP-Statuscode) — Übersicht und Geschichte
- [RFC 9110 — HTTP Semantics](https://httpwg.org/specs/rfc9110.html) — die normative Spezifikation (englisch)
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [curl](https://www.jpkc.com/db/cheatsheets/networking/curl/) — HTTP-Requests senden und Statuscodes direkt in der Shell prüfen
- [httpie](https://www.jpkc.com/db/cheatsheets/networking/httpie/) — benutzerfreundlicher HTTP-Client für API-Tests
- [ab](https://www.jpkc.com/db/cheatsheets/networking/ab/) — Apache Bench: Lasttests mit Statuscode-Auswertung

