Home > PHP, Programmierung, Webmaster und Co., Webserver > HTTP-Statuscodes: HTTP-Tutorial Teil-1

HTTP-Statuscodes: HTTP-Tutorial Teil-1

29. November 2010 WIMHO
Kaum beachtet und doch wichtig: HTTP-Statuscodes

HTTP Statuscode

Kurz nachdem ich dieser Tage ein PHP-Script geschrieben hatte welches von einem meiner Server über das HTTP-Protokoll Daten abfragt, und ich mich aus diesem Grunde mal wieder mit den HTTP-Statuscodes beschäftigt hatte, ploppte ein Messenger-Fenster auf und ein alter Webmaster-Kollege fragte: “Sach ma Olli, wie war det nochma mit die janzen Fehler-Codes vom Webserver? Jibt det da ne Liste?” Nach meiner spontanen Antwort: “Google ist dein Freund und Helfer” bekam er aber dann doch einen Schwung an Links von mir, welche ich gerade wenige Tage zuvor im Zuge meiner eigenen Recherche zusammengetragen hatte. Selbstverständlich folgten weitere Fragen bezüglich dem Senden und dem korrekten Auswerten entsprechender Status-Codes. Und wenn man als Blogger so intensiv auf ein Thema gestoßen wird, was macht man da? Richtig! Man schreibt einen Artikel. Aus diesem Grund dreht sich im heutigen Beitrag alles um das HTTP-Protokoll, die HTTP-Statuscodes und deren Anwendung.

Okay, ich geb’s ja zu. Ich neige hin und wieder zu etwas längeren Artikeln. :-) Und da sich beim schreiben dieses Artikels wiedermal gezeigt hat daß es mit “drei Worten” nicht getan ist, werde ich dieses kleine Tutorial in drei Teile aufsplitten.

Teil 1: Die HTTP-Statuscodes

Teil-2: Das HTTP-Protokoll

Zwischenbemerkung: Wie immer werde ich für eine bessere Verständlichkeit manche Zusammenhänge etwas vereinfacht erklären. Die Profis unter Euch wissen eh Bescheid und brauchen dieses Tutorial nicht. Wer sich aber zum ersten mal mit der Materie beschäftigt soll nicht gleich mit unzähligen für das grundlegende Verständnis nicht erforderlichen Informationen erschlagen werden. Man könnte sagen: Nicht das Detail sondern das Prinzip ist das Ziel. :-)

Das HTTP-Protokoll:

Das Kürzel “HTTP” steht für “Hypertext Transfer Protocol” und beschreibt eine Reihe von Übertragungs-Regeln, welche bei der Abfrage bzw. Übertragung von Hypertext-Dokumenten zwischen einem Client (der ein Dokument anfordert) und einem Server (der das Dokument ausliefert) benutzt werden. Mal abgesehen von anderen Anwendungsfällen wird das HTTP-Protokoll z.B. bei der Abfrage von Webseiten durch einen Browser eingesetzt. Oder kurz: Wenn ich mit meinem Firefox auf eine Webseite surfe so wird bei der Übertragung das HTTP-Protokoll benutzt. In der Praxis ist eine HTTP-Übertragung aber nicht auf “Hypertext-Dokumente” beschränkt, sondern kann nahezu jede Art von Daten übertragen (Video-, Audio-, Bild-Dateien, PDF, XML, ZIP usw.).

Nebenbei bemerkt: “HTTP-Protokoll” ist eigentlich doppelt-gemoppelt (würde ja dann “Hypertext-Transfer-Protocol-Protokoll” heißen).

Was ist ein HTTP-Statuscode?

Der 404-Statuscode ist der Namensgeber für die 404-Fehlerseite.

404 Not Found

Immer wenn ein Client über das HTTP-Protokoll eine Anfrage an einen Server sendet, so antwortet dieser (vorausgesetzt er versteht HTTP) mindestens mit einem Statuscode. Mit Hilfe des empfangenen Statuscodes kann der Client nun feststellen ob die Anfrage entweder Erfolgt hatte oder ob ein Fehler aufgetreten ist. Hatte die Anfrage keinen Erfolg, so lässt sich aus dem Statuscode erkennen welche Art von Fehler vorliegt oder wie zu verfahren ist um die Anfrage zum Erfolg zu führen. Der Client kann nun entsprechend darauf reagieren.

Ein konkreter Anwendungsfall wäre z.B. eine mittels Passwort (z.B. auth_basic oder auth_digest) geschützte Webseite: Der Browser (Client) fordert von einem Webserver das Dokument “dasistvollgeheim.html” an. Nun ist dieses Dokument aber Passwort-geschützt. Also sendet der Webserver als Antwort zum Browser den Statuscode “401″ (Authentifizierung erforderlich). Nun weiß der Browser daß für diese Webseite ein Passwort erforderlich ist und wird dem User ein entsprechendes Eingabefeld für Username und Passwort anzeigen. Hat der User seine Zugangsdaten eingegeben sendet der Browser die Anfrage erneut zum Webserver, diesmal aber inklusive Benutzername und Passwort. Der Webserver prüft nun die übermittelten Daten und liefert (wenn Username und Passwort korrekt) den Statuscode “200″ (Anfrage erfolgreich) gefolgt vom angeforderten Dokument “dasistvollgeheim.html” aus.

Welche Arten von HTTP-Statuscodes gibt es?

Die HTTP-Statuscodes sind in 5 verschiedene Kategorien oder Klassen aufgeteilt, wobei jede Klasse an der ersten Ziffer des 3-Stelligen Statuscode zu erkennen ist:

  • 1xx – Information zur Bearbeitung: Statuscodes die mit einer 1 anfangen werden während der Anfrage gesendet und z.B. zur Vermeidung von Timeouts verwendet.
  • 2xx – Operation war erfolgreich: Wenn die Bearbeitung einer Anfrage erfolgreich war wird ein 2er Statuscode gesendet. Ein Anwendungsfall wäre z.B. wenn die Anfrage erfolgreich bearbeitet wurde aber das Ergebnis an einem anderen Ort (Adresse) zu finden ist (201 Created).
  • 3xx – Umleitung bzw. Hinweis auf eine geänderte Adresse: Immer wenn das angeforderte Dokument dauerhaft oder vorübergehend an einem anderen Ort zu finden ist wird ein 3er Statuscode gesendet.
  • 4xx – Fehlercode mit Bezug auf den Client: Immer wenn bei der Bearbeitung einer Anfrage ein Fehler auftritt der vermutlich auf den Client zurückzuführen ist, wird ein 4er Code gesendet. Klassisches Beispiel in dieser Klasse wäre der Statuscode 404 “Not Found”, welcher immer dann auftritt wenn der Client ein Dokument angefordert hat welches auf dem Server nicht existiert.
  • 5xx – Fehlercode mit Bezug auf den Server: Die 5er Statuscodes schließlich werden immer dann gesendet wenn bei der Bearbeitung der Anfrage ein Fehler auftritt, welcher eher auf der Server-Seite zu suchen ist. Ist ein Server z.B. überlastet oder vorübergehend nicht verfügbar könnte er dies korrekter Weise mit einem 503-Statuscode (Service Unavailable) signalisieren (wenn er denn in einem solchen Fall überhaupt noch antworten kann oder antworten will).

Und wie sieht jetzt so ein Statuscode aus?

Die wichtigsten HTTP-Statuscodes sollte man kennen.

Statuscodes

Die Kommunikation innerhalb des HTTP-Protokolls funktioniert mit “normalem Text” wie in einer Text-Datei mit ganz normalen ASCII-Zeichen Zeile für Zeile, jeweils mit einem Zeilenvorschub am Ende. Der Client schickt also seine Anfrage in Form von (einer oder) mehreren Zeilen Text, und der Server Antwortet auf die gleiche Weise. Der HTTP-Statuscode des Servers befindet sich dabei immer in der 1. “Textzeile” der Server-Antwort welche in der Form

Protokoll/Version Statuscode Beschreibung

gesendet wird. Die erste Serverantwort-Zeile beinhaltet also 3 Informationen:

  1. Protokoll-Name und Protokoll-Version
  2. HTTP-Statuscode
  3. Beschreibung des Statuscode als Text

…jeweils getrennt mit einem Leerzeichen. Wobei evtl. vorhandene Leerzeichen innerhalb der Statuscode-Beschreibung nicht stören. Ein echtes Beispiel der ersten Server-Antwort-Zeile einer erfolgreichen Client-Anfrage sähe dann so aus:

HTTP/1.1 200 OK

Wie man deutlich erkennen kann, antwortet der Server hier mit dem Statuscode 200 “OK”, welcher für eine erfolgreich ausgeführte Anfrage steht. Ist das angeforderte Dokument auf dem Server nicht vorhanden so würde die erste Zeile seiner Antwort z.B. so aussehen:

HTTP/1.1 404 Not Found

Im Grunde findet innerhalb des HTTP-Protokolls also “menschenlesbare Klartext-Kommunikation” statt. Beste Voraussetzungen also einerseits das Protokoll zu verstehen und andererseits z.B. in PHP damit umzugehen.

Die wichtigsten Statuscodes:

In der Praxis hat man es als angehender Webmaster oder Programmierer überwiegend nur mit einem Teil der möglichen HTTP-Statuscodes zu tun. Deshalb möchte ich an dieser Stelle nur die häufigsten bzw. wichtigsten Statuscodes kurz beschreiben:

200 OK: Sicher der häufigste Statuscode denn er wird immer dann zurückgegeben wenn der Server eine Anfrage akzeptiert hat, korrekt bearbeiten konnte und das Ergebnis gleich mit der Antwort sendet. Wenn also beim normalen surfen im Web ein Webserver eine normale, einfache und existierende Webseite ausliefert, befindet sich im Header der Serverantwort im Regelfall der HTTP-Statuscode 200. Dies gilt nicht nur für normale Webseiten sondern für jedes Dokument welches über das HTTP-Protokoll übertragen wird (also auch PDFs, Bilder, Downloads usw.).

301 Moved Permanently: Der Statuscode 301 wird bei der “berühmten” 301-Weiterleitung gesendet und bedeutet nichts anderes als daß das angeforderte Dokument künftig unter einer anderen Adresse zu erreichen ist. Webmaster verwenden diesen Statuscode oft um, nach einem Wechsel der Domain oder nach der Umstrukturierung eines Projektes, die Besucher (und Suchmaschinen) auf die neue Adresse der jeweiligen Dokumente zu leiten. Wie man so was macht werde ich bei Gelegenheit mal ausführlich erklären, bis dahin aber hilft sicher auch ein Blick in den Artikel 301-Weiterleitung mit mod_rewrite weiter.

302 Found: Dieser Statuscode steht für eine temporäre/vorübergehende Weiterleitung, auch wenn der Statuscode-Text hier lediglich “Found” lautet. Statuscode 302 wird z.B. dann von einem Server gesendet wenn das angeforderte Dokument nur vorübergehend unter einer anderen Adresse zu finden ist, später aber wieder unter der alten “originalen” Adresse. Webmaster die diesen Statuscode verwenden möchten sollten sich unbedingt auch den Wikipedia-Artikel zum Thema URL-Hijacking “rein ziehen”, wie so oft kann man nämlich auch Fehler machen.

400 Bad Request: Ein HTTP-Statuscode wird vom Server ja immer als Antwort auf eine Anfrage eines Clients gesendet. Wenn der Server diese Anfrage nicht versteht oder als Fehlerhaft erkennt so antwortet er mit “400 Bad Request”.

401 Unauthorized: Mit diesem Statuscode als Antwort teilt der Server mit daß der Client für das angeforderte Dokument nicht autorisiert ist. Kurz und gut also Zugriff verweigert. Dies tritt beispielsweise dann ein wenn ein Dokument (bzw. ein Verzeichnis) auf dem Server mittels Basic-Authentication (auth_basic) oder Digest-Access-Authentication (auth_digest) Passwort-geschützt ist. Siehe auch den Artikel zum Thema Apache mod_auth_basic und mod_auth_digest.

403 Forbidden: Wenn ein Client auf eine Anfrage hin diesen Statuscode erhält so bedeutet das, daß ihm der Zugriff grundsätzlich verboten ist. Im Gegensatz zur Meldung “Unauthorized” (401) , wo der Client sich ja noch autorisieren kann, wird der Zugriff hier prinzipiell verweigert (z.B. für die Client-IP oder das Client-Teilnetz). Wenn man eine nur per verschlüsseltem HTTP (HTTPS) erreichbare URL mit normalem unverschlüsseltem HTTP an-surft so erhält man in der Regel auch eine 403-Statuscode Meldung.

404 Not Found: Der “Klassiker” schlecht hin: Seite nicht gefunden. Hier gibts also nicht viel zu erklären. Existiert das angeforderte Dokument auf dem Server nicht (und kann der Server auch nicht dahin weiterleiten) gibt er einen 404-Statuscode, gerne auch “404-Fehlermeldung” genannt, zurück.

500 Internal Server Error: Der Server kann die Anfrage auf Grund eines unerwarteten Zustandes nicht bearbeiten. Dieser Statuscode wird vom Server dann zurück gegeben wenn der aufgetretene Fehler nicht genau bestimmt werden kann bzw. kein Statuscode für diesen Fehler existiert. In Der Praxis kann dieser “Zustand” z.B. dann auftreten, wenn die Server-Konfiguration Fehler enthält (z.B. in der Apache httpd.conf) oder wenn sich ein auf dem Server ausgeführtes Script (z.B. innerhalb von PHP) unvorhergesehen verhält.

501 Not Implemented: Mit diesem Statuscode gibt der Server zu verstehen daß er die vom Client angeforderte Funktionalität nicht unterstützt. Ein Beispiel wäre eine nicht existierende oder vom Server nicht unterstützte HTTP-Methode (gängige HTTP-Methoden wären z.B. GET oder POST).

503 Server Unavailable: Sendet ein Server diesen Statuscode als Antwort so weiß der Client das der Server die gestellte Anfrage zur Zeit nicht beantworten kann. Ein immer wieder gern genanntes Beispiel wäre die Situation in der der Server überlastet ist. In diesem Moment könnte er eine “503″ senden gefolgt von einem optionalen Hinweis wann der Client eine erneute Anfrage versuchen kann. Tatsächlich aber dürften die meisten Server wenn sie überlastet sind (also z.B. zu viele Seitenaufrufe zur gleichen Zeit) einfach nicht antworten.

Komplette Liste aller HTTP 1.1 Statuscodes:

Viele Statuscodes die in der HTTP-Protokoll Definition festgelegt wurden treten in der Praxis nicht oder nur sehr selten auf. Es kann aber nicht schaden auch die seltenen Statuscodes zumindest schon mal gesehen zu haben. Hier folgt also nun eine Übersicht der für das HTTP-Protokoll v1.1 in der RFC 2616 festgelegten HTTP-Statuscodes:

1xx: Informational (Informationen)

  • 100 Continue
  • 101 Switching Protocols

2xx: Successful (Erfolgreich)

  • 200 OK
  • 201 Created
  • 202 Accepted
  • 203 Non-Authoritative Information
  • 204 No Content
  • 205 Reset Content
  • 206 Partial Content

3xx: Redirection (Umleitung)

  • 300 Multiple Choices
  • 301 Moved Permanently
  • 302 Found
  • 303 See Other
  • 304 Not Modified
  • 305 Use Proxy
  • 306 Reserved (nicht länger benutzt)
  • 307 Temporary Redirect

4xx: Client Error (Fehler auf Clientseite)

  • 400 Bad Request
  • 401 Unauthorized
  • 402 Payment Required
  • 403 Forbidden
  • 404 Not Found
  • 405 Method Not Allowed
  • 406 Not Acceptable
  • 407 Proxy Authentication Required
  • 408 Request Timeout
  • 409 Conflict
  • 410 Gone
  • 411 Length Required
  • 412 Precondition Failed
  • 413 Request Entity Too Large
  • 414 Request-URI Too Long
  • 415 Unsupported Media Type
  • 416 Requested Range Not Satisfiable
  • 417 Expectation Failed

5xx: Server Error (Fehler auf Serverseite)

  • 500 Internal Server Error
  • 501 Not Implemented
  • 502 Bad Gateway
  • 503 Service Unavailable
  • 504 Gateway Timeout
  • 505 HTTP Version Not Supported

HTTP Wissen und Quellen:

Links und Quellen zum Thema Statuscodes.

Statuscode-Links

Natürlich gibt es eine Menge Quellen mit denen man sein Wissen über das HTTP-Protokoll im allgemeinen und die HTTP-Statuscodes im besonderen mehren kann. Erster Anlaufpunkt ist natürlich die “original” HTTP/1.1 Spezifikation im RFC 2616. Dort sind auch die nicht so häufigen Statuscodes genau beschrieben. Auch die Wikipedia widmet den HTTP-Statuscodes einen eigenen Artikel in dem auch noch weitere Codes aufgeführt sind. Auf iana.org werden ebenfalls die HTTP-Statuscodes des HTTP/1.1 Protokoll  behandelt. Der IIS Internet-Information-Server von Microsoft scheint, was die Statuscodes betrifft, in gewissem Rahmen sein eigenes Süppchen zu kochen, deshalb sollte man auch einen Blick in den Support-Artikel zu den IIS-Statuscodes werfen. Und wer immer noch nicht genug hat der kann sich ja von den hundert-tausenden von Suchergebnissen erschlagen lassen, welche eine Recherche mit dem Begriff “HTTP Statuscodes” in den bekannten Suchmaschinen zu Tage fördert.

Buchempfehlung:

Leider gibt es rund um das HTTP-Protokoll nur wenig Material zum “in die Hand nehmen und blättern”. Wer dennoch auf der Suche nach einem Schmöker zum Thema ist kann ja mal versuchen ob er das Büchlein “HTTP kurz & gut” auftreiben kann. Ist zwar schon etwas älter und war zuletzt vergriffen, bietet aber eine schöne Übersicht zum HTTP-Protokoll inklusive Referenz der HTTP-Header und Statuscodes. Wer sich als Webmaster, vielleicht sogar mit eigenem Server, für das HTTP-Protokoll und die Statuscodes interessiert, der kann sich alternativ auch den Wälzer “Apache 2 – Das umfassende Handbuch” zulegen. Hier geht es zwar im wesentlichen um den Apache HTTP-Server in der Version 2.2, aber es werden eben auch die HTTP-Header, die HTTP-Statuscodes und die ganze HTTP-Client-Abfrage behandelt.

To Be Continued…:

Dieses war der erste Streich und der zweite folgt sogleich… ;-)

HTTP-Protokoll: HTTP-Tutorial Teil-2

HTTP-Protokoll: HTTP-Tutorial Teil-2

  1. Bisher keine Kommentare
Kommentare sind geschlossen