Overzicht van HTTP-statuscodes
Elke HTTP-response begint met een statuscode van drie cijfers die de client vertelt wat er is gebeurd. Bekijk de codes per klasse, met uitleg in begrijpelijke taal, voorbeeldresponses en wat elke code betekent voor redirects en SEO.
1xx Informatief
Het verzoek is ontvangen en wordt verder verwerkt. Deze tussentijdse responses komen binnen vóór de definitieve response en vormen nooit het einde van een redirectketen.
- 100
Continue
Tussentijdse response: de server heeft de requestheaders geaccepteerd en de client, die “Expect: 100-continue” stuurde, kan nu de requestbody versturen. - 101
Switching Protocols
De server accepteert het Upgrade-verzoek van de client en schakelt deze verbinding over op een ander protocol, in de praktijk bijna altijd WebSocket. - 102
Processing
Verouderde tussentijdse WebDAV-response die de client laat weten dat de server nog met een lang verzoek bezig is en dat de client moet blijven wachten. - 103
Early Hints
Tussentijdse response met Link-headers vóór de definitieve response, zodat browsers assets kunnen preloaden of alvast verbinden terwijl de server nog werkt.
2xx Succes
Het verzoek is ontvangen, begrepen en geaccepteerd. Een gezonde redirectketen eindigt op een van deze codes, meestal op 200 OK.
- 200
OK
Het verzoek is gelukt; bij GET bevat de body de opgevraagde resource. Elke redirectketen hoort te eindigen op een URL die 200 teruggeeft. - 201
Created
Het verzoek is gelukt en heeft een nieuwe resource aangemaakt, meestal na POST of PUT. De Location-header wijst, als die er is, naar de nieuwe resource. - 202
Accepted
Het verzoek is geaccepteerd voor verwerking, maar nog niet afgerond. Gebruikt voor asynchrone jobs; de uiteindelijke uitkomst is niet gegarandeerd. - 203
Non-Authoritative Information
Het verzoek is gelukt, maar een transformerende proxy heeft de response aangepast, dus de inhoud is niet precies wat de oorspronkelijke server stuurde. - 204
No Content
Het verzoek is gelukt en er is geen inhoud om te sturen. Browsers blijven op de huidige pagina; gebruikelijk bij DELETE, beacons en CORS-preflight. - 205
Reset Content
Het verzoek is gelukt en de client moet de documentweergave resetten, bijvoorbeeld door het zojuist verzonden formulier leeg te maken. - 206
Partial Content
De server stuurt alleen de bytebereiken die de client met een Range-header heeft gevraagd, zoals bij videostreaming en hervatbare downloads. - 207
Multi-Status
WebDAV-response die in een XML-body (multistatus) een aparte statuscode geeft voor elk van meerdere resources of eigenschappen. - 208
Already Reported
Gebruikt binnen een WebDAV-207-response: de leden van deze collectie zijn al eerder vermeld, wat eindeloze herhaling voorkomt als bindings een lus vormen. - 226
IM Used
De server beantwoordde een GET met delta-encoding (RFC 3229): de body bevat alleen de wijzigingen ten opzichte van een versie die de client al heeft.
3xx Redirect
De client moet nog een actie uitvoeren, meestal door de URL uit de Location-header op te vragen. Uit deze codes bestaat een redirectketen.
- 300
Multiple Choices
De resource heeft meerdere representaties en de client mag er een kiezen. Browsers volgen een 300 niet automatisch, ook niet met een Location-header. - 301
Moved Permanently
De resource heeft een nieuwe, permanente URL, die in de Location-header staat. Clients en zoekmachines horen voortaan de nieuwe URL te gebruiken. - 302
Found
De resource staat tijdelijk op een andere URL. Clients volgen de Location-header, maar horen in de toekomst de oorspronkelijke URL te blijven gebruiken. - 303
See Other
Stuurt de client door naar een andere URL die hij met GET moet ophalen, meestal om na een formulierverzending een resultaatpagina te tonen (Post/Redirect/Get). - 304
Not Modified
Antwoord op een conditionele GET of HEAD: de gecachete kopie van de client is nog geldig, dus de server stuurt geen body en de kopie wordt hergebruikt. - 305
Use Proxy
Verouderd. Vertelde de client het verzoek te herhalen via de proxy in de Location-header; browsers negeren de code om veiligheidsredenen. - 306
Niet in gebruik (voorheen Switch Proxy)
Gereserveerd en niet in gebruik. 306 werd ooit voorgesteld als “Switch Proxy”, maar is geschrapt; gebruik de code niet. Clients zien hem als onbekende 3xx. - 307
Temporary Redirect
Tijdelijke redirect die het verzoek met dezelfde methode en body naar de Location-URL moet herhalen, anders dan 302, waarbij POST een GET mag worden. - 308
Permanent Redirect
Permanente redirect die de requestmethode en body behoudt. Net als bij 301 hoort voortaan de nieuwe URL te worden gebruikt, maar POST wordt nooit GET.
4xx Clientfout
Het verzoek kan in deze vorm niet worden uitgevoerd: de pagina bestaat niet, de toegang wordt geweigerd of de client heeft te veel verzoeken verstuurd.
- 400
Bad Request
De server verwerkt het verzoek niet vanwege een fout aan de clientkant, zoals een ongeldige syntaxis, een ongeldige URL of te grote cookies. - 401
Unauthorized
Het verzoek vereist geldige authenticatie. De server moet een WWW-Authenticate-header sturen die aangeeft hoe dat moet, bijvoorbeeld met Basic of Bearer. - 402
Payment Required
Door HTTP gereserveerd voor toekomstig gebruik. In de praktijk gebruiken sommige API’s en diensten de code als een betaling, tegoed of abonnement nodig is. - 403
Forbidden
De server begrijpt het verzoek, maar weigert toegang. Anders dan bij 401 helpt het niet om dezelfde inloggegevens gewoon opnieuw te sturen. - 404
Not Found
De server heeft niets op deze URL, of wil niet zeggen of er iets bestaat. De code zegt niet of de afwezigheid tijdelijk of permanent is. - 405
Method Not Allowed
De URL bestaat, maar ondersteunt de gebruikte HTTP-methode niet, bijvoorbeeld POST naar een statische pagina. De Allow-header noemt de ondersteunde methoden. - 406
Not Acceptable
De server kan geen response maken die past bij de Accept-headers van de client (formaat, taal, encoding) en wil geen standaardversie sturen. - 407
Proxy Authentication Required
Net als 401, maar hier vereist een proxy tussen client en server authenticatie. De Proxy-Authenticate-header geeft aan hoe je je aanmeldt. - 408
Request Timeout
De server heeft niet op tijd een volledig verzoek ontvangen en sluit de verbinding. De client mag het verzoek opnieuw sturen via een nieuwe verbinding. - 409
Conflict
Het verzoek botst met de huidige staat van de resource, bijvoorbeeld door een bewerkingsconflict, een dubbel record of een afwijkende versie. - 410
Gone
De resource is bewust verwijderd en komt naar verwachting niet terug. Een duidelijker, permanent signaal dan 404 Not Found. - 411
Length Required
De server weigert een verzoek met een body maar zonder Content-Length-header. De client kan het opnieuw sturen met een geldige Content-Length. - 412
Precondition Failed
Een voorwaarde in de requestheaders, zoals If-Match of If-Unmodified-Since, bleek onwaar, dus de server heeft de wijziging niet doorgevoerd. - 413
Content Too Large
De requestbody is groter dan de server accepteert, zoals bij te grote uploads. Heette eerder “Payload Too Large” en “Request Entity Too Large”. - 414
URI Too Long
De opgevraagde URL is langer dan de server wil verwerken, bijvoorbeeld omdat een redirectloop steeds parameters aan de URL toevoegt. - 415
Unsupported Media Type
De server weigert de requestbody, omdat het formaat (Content-Type) of de content-codering (Content-Encoding) niet wordt ondersteund. - 416
Range Not Satisfiable
Het bytebereik in de Range-header valt buiten het bestand, bijvoorbeeld als een download wordt hervat voorbij het einde van een gewijzigd bestand. - 417
Expectation Failed
De server kan niet voldoen aan de verwachting in de Expect-header van het verzoek. In de praktijk wordt Expect: 100-continue dan niet ondersteund. - 418
I’m a Teapot
Een 1 aprilgrap uit het koffiepotprotocol van 1998 (RFC 2324). In HTTP gereserveerd als ongebruikt, maar sommige sites geven de code bewust terug. - 421
Misdirected Request
Het verzoek kwam terecht bij een server die niet voor deze hostnaam kan antwoorden, vaak door een TLS-SNI-mismatch of een hergebruikte HTTP/2-verbinding. - 422
Unprocessable Content
Het verzoek is correct opgebouwd, maar de inhoud is semantisch ongeldig, meestal een validatiefout in een API. Heette eerder “Unprocessable Entity”. - 423
Locked
WebDAV: de resource is vergrendeld, dus de methode kan nu niet worden toegepast. De client heeft het lock-token nodig of moet wachten tot de lock afloopt. - 424
Failed Dependency
WebDAV: de methode kon niet worden uitgevoerd, omdat een andere actie waarvan die afhing is mislukt, bijvoorbeeld één eigenschap in een PROPPATCH. - 425
Too Early
De server verwerkt geen verzoek dat als TLS-early data (0-RTT) is verstuurd, omdat het herhaald kan worden. De client probeert het na de handshake opnieuw. - 426
Upgrade Required
De server weigert het verzoek via het huidige protocol af te handelen en eist een upgrade naar het protocol dat in de Upgrade-header staat. - 428
Precondition Required
De server eist dat het verzoek conditioneel is (If-Match), om verloren updates te voorkomen als meerdere clients dezelfde resource bewerken. - 429
Too Many Requests
De client heeft te veel verzoeken in een bepaalde tijd gestuurd (rate limiting). Een Retry-After-header kan aangeven hoelang je moet wachten. - 431
Request Header Fields Too Large
De server weigert het verzoek, omdat de headers te groot zijn, meestal doordat de browser te veel of te grote cookies meestuurt. - 444
No Response
nginx Niet-standaardcode van nginx: de server sluit de verbinding zonder response te sturen. Clients krijgen een leeg antwoord en nooit een 444. - 451
Unavailable For Legal Reasons
Toegang geweigerd vanwege een juridische eis, zoals een gerechtelijk bevel of een blokkade door de overheid. Vernoemd naar Fahrenheit 451 van Ray Bradbury. - 499
Client Closed Request
nginx Niet-standaardcode die nginx in de access log schrijft als de client de verbinding sloot voordat de server zijn response had verstuurd.
5xx Serverfout
De server kon een ogenschijnlijk geldig verzoek niet uitvoeren. Aanhoudende 5xx-fouten houden zowel bezoekers als crawlers tegen.
- 500
Internal Server Error
Algemene fout aan de serverkant: er ging iets mis op de server, zoals een crash van de applicatie of een kapot configuratiebestand. - 501
Not Implemented
De server ondersteunt de functionaliteit niet die nodig is om het verzoek uit te voeren, meestal een HTTP-methode die hij niet herkent. - 502
Bad Gateway
Een gateway of proxy kreeg een ongeldige response van de upstreamserver, bijvoorbeeld omdat de applicatie achter nginx is gecrasht. - 503
Service Unavailable
De server kan het verzoek tijdelijk niet afhandelen door overbelasting of onderhoud. Retry-After kan aangeven wanneer je het opnieuw kunt proberen. - 504
Gateway Timeout
Een gateway of proxy kreeg niet op tijd een response van de upstreamserver, meestal omdat de applicatie te traag is. - 505
HTTP Version Not Supported
De server ondersteunt de hoofdversie van HTTP in het verzoek niet of weigert dat. Tegenwoordig wijst dit vaak op een misvormde requestregel. - 506
Variant Also Negotiates
Configuratiefout op de server bij transparante content negotiation (RFC 2295): de gekozen variant is zelf ook onderhandelbaar, wat een lus oplevert. - 507
Insufficient Storage
WebDAV: de server kan de data die nodig is om het verzoek af te ronden niet opslaan, bijvoorbeeld omdat een schijf of gebruikersquotum vol is. - 508
Loop Detected
WebDAV: de server stopte een bewerking met Depth: infinity, omdat hij een oneindige lus van bindings vond. Heeft niets te maken met redirectloops. - 510
Not Extended
Uit het verouderde HTTP Extension Framework (RFC 2774): het verzoek mist een vereiste declaratie van een extensie. Historisch en feitelijk ongebruikt. - 511
Network Authentication Required
Het netwerk, meestal een captive portal van een wifinetwerk, vereist dat je inlogt. Verstuurd door netwerken die verkeer onderscheppen, niet door webservers. - 520
Web Server Returned an Unknown Error
Cloudflare Cloudflare-specifiek: de oorspronkelijke server gaf een lege, onbekende of onverwachte response, bijvoorbeeld na een crash of een verbroken verbinding. - 521
Web Server Is Down
Cloudflare Cloudflare-specifiek: de oorspronkelijke server weigerde de verbinding van Cloudflare, meestal omdat de webserver niet draait of Cloudflare blokkeert. - 522
Connection Timed Out
Cloudflare Cloudflare-specifiek: Cloudflare kon niet op tijd een TCP-verbinding met de oorspronkelijke server opzetten, of die bevestigde het verzoek niet. - 523
Origin Is Unreachable
Cloudflare Cloudflare-specifiek: Cloudflare kan de oorspronkelijke server helemaal niet bereiken, meestal door een routeringsprobleem of een verkeerd IP-adres in de DNS. - 524
A Timeout Occurred
Cloudflare Cloudflare-specifiek: Cloudflare had verbinding met de oorspronkelijke server, maar kreeg binnen de time-out (standaard zo’n twee minuten) geen HTTP-response. - 525
SSL Handshake Failed
Cloudflare Cloudflare-specifiek: de TLS-handshake tussen Cloudflare en de oorspronkelijke server is mislukt, bijvoorbeeld omdat die geen geldig certificaat heeft. - 526
Invalid SSL Certificate
Cloudflare Cloudflare-specifiek: in de modus Full (strict) kon Cloudflare het servercertificaat niet valideren, bijv. verlopen, self-signed of voor een andere naam. - 530
Cloudflare-fout 1xxx
Cloudflare Cloudflare-specifiek: verstuurd samen met een Cloudflare-fout 1xxx, bijvoorbeeld 1016 (Origin DNS error) of 1033 (Cloudflare Tunnel error).
Zo lees je een HTTP-statuscode
Het eerste cijfer geeft de klasse van de response aan; de andere twee bepalen de precieze betekenis binnen die klasse. Een client die een bepaalde code niet kent, behandelt die als de x00-code van de klasse. Een onbekende 4xx-code wordt dus afgehandeld als 400 Bad Request.
De statustekst na het getal (de reason phrase), zoals Not Found of Moved Permanently, is alleen een omschrijving voor mensen. Clients kijken uitsluitend naar het getal, en HTTP/2 en HTTP/3 sturen helemaal geen statustekst mee.
Redirect-statuscodes op een rij
- 301 Moved Permanently: permanent; browsers mogen een POST veranderen in een GET. De standaardkeuze voor verhuisde pagina’s.
- 302 Found: tijdelijk; de methode mag veranderen. De standaard in veel frameworks.
- 303 See Other: tijdelijk; wordt altijd gevolgd met GET. Gebruikelijk na het verzenden van een formulier.
- 307 Temporary Redirect: tijdelijk; methode en body blijven behouden.
- 308 Permanent Redirect: permanent; methode en body blijven behouden.
- 304 Not Modified: geen redirect naar een andere URL, maar een signaal dat de kopie in de cache van de client nog geldig is.
In HTTP-statuscodes voor redirects uitgelegd lees je wanneer je welke code gebruikt.
Statuscodes in een redirectketen
Een redirectketen is een reeks 3xx-responses die eindigt op een definitieve response. Alleen de laatste statuscode is wat de bezoeker of crawler echt krijgt. Een keten die op een 404 eindigt, is dus een dode link, hoe netjes de redirects ervoor er ook uitzien. Gebruik de redirectchecker om de statuscode van elke hop (elke stap in de keten) te zien, of de Bulk-redirectchecker om meerdere URL’s tegelijk te controleren.
Redirectchecker
Bekijk elke statuscode die een URL teruggeeft, hop voor hop, met de gratis redirectchecker van TrueURL.