Die ist der erste Teil einer Serie mit dem Titel “Webserver in a Nutshell”
In den letzten Tagen haben mich nach dem Artikel “Sehr geehrte Damen und Herren von serverkompetenz.net mit den IP-Adressen 81.169.129.13 und 85.214.36.241” mehrere Fragen zu Webservern, HTTP und entsprechenden Tools erreicht. Aus diesem Grunde habe ich mich jetzt entschieden, hier eine kleine, unregelmäßige Serie zu den gewünschten Themen zu starten.
Jeder Beitrag der Serie wird mit dem Titel “Webserver in a Nutshell” beginnen. Alle Artikel werden zusätzlich mit dem Tag “WSiNS” versehen sein. Diesen Tag werde ich ausschließlich für diese Serie verwenden.
Doch nun zu HEAD
HTTP-Methoden
Das HTTP-Protokoll der Version 1.1. ist in der RFC2616 beschrieben. Die RFC definiert verschiedene Methoden des HTTP-Protokolls im Kapitel 9. Die bekanntesten von ihnen sind die HTTP-Methoden GET und POST - auf die ich hier nicht weiter eingehen möchte. Weniger bekannt ist dagegen die HEAD-Methode.
Was ist die HTTP-HEAD-Methode?
HEAD unterscheidet sich nur in einem Punkt von der GET-Methode: Der Server antwortet mit den gleichen Headern - aber er überträgt den Inhalt der angeforderten Ressource selbst nicht! Die RFC2616 sagt:
The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. The metainformation contained in the HTTP headers in response to a HEAD request SHOULD be identical to the information sent in response to a GET request.
Unter Ressource versteht man, zum Beispiel eine HTML-Datei oder ein Bild.
Wozu HTTP-HEAD dient
HEAD wird hauptsächlich dazu benutzt, um die Verfügbarkeit und/oder Existenz einer Ressource zu testen sowie weitere Informationen, die Metadaten genannt werden, über sie zu erhalten.
Metadaten sind zum Beispiel Angaben darüber, wann eine Datei zuletzt geändert wurde oder wie groß diese Datei ist.
Wie bereits beschrieben, werden bei HEAD die selben Daten wie bei GET übetrtragen - mit der Ausnahme, daß ebend die Datei selbst nicht mit übertragen wird. Oder anders ausgedrückt: Wenn ich nur wissen will, ob etwas auf einem Server überhaupt vorhanden ist, welche Größe es hat und wann es zuletzt geändert wurde, nehme ich die HTTP-Methode HEAD. Da dabei die Ressource selbst nicht mit übertragen wird, spare ich Bandbreite und bin schneller fertig. Das ist ein entscheidener Punkt unter anderem in der Mobilkommunikation. Sollte ich durch die übertragenen Metadaten feststellen, daß die Ressource zum Beispiel neuer ist, als jene, die ich mal angenommen lokal in meinem Speicher habe, kann ich sie dann anfordern. Hat sie sich aber nicht geändert, nehme ich einfach die Kopie aus meinem Speicher.
So weit zur Theorie - jetzt die Praxis:
Die Kommunikation per HTTP-Protokoll sichtbar machen
Stell Dir vor, daß Du eine bestimmte Adresse - zum Beipiel google.de - in die Adresse Deines Browsers eintippst. Nach dem Drücken der Enter-Taste wird die Seite von Google zu Dir übertragen und in Deinem Browser angezeigt. Die dabei ablaufende Kommunikation kannst Du Dir aber auch in einem Xterm ansehen: Gib einfach auf der Kommandozeile mal das Folgende ein (nur das Fettgedruckte):
telnet www.google.de 80
Trying 69.66.249.93.104...
Connected to www.google.de.
Escape character is '^]'.
GET / HTTP/1.1
Host: www.google.de
[nochmal ENTER drücken]
Was dann ausgegeben wird ist der Quellcode der Google-Startseite.
Über diesen Weg kannst Du jederzeit die Kommunikation zwischen Browser und Webserver nachstellen.
Ein konkretes Beispiel für die HTTP-HEAD-Methode
Google blendet auf jeder Suchergebnisseite links oben das eigene Logo verkleinert ein. Die komplette URL des Logos ist: http://www.google.de/images/logo_sm.gif. In unserem Beispiel interessiert uns nur, wie Groß das Logo ist und wann es zuletzt geändert wurde. Um das zu erfahren benutzen wir die HEAD-Methode:
telnet www.google.de 80
Trying 66.249.93.104...
Connected to www.google.de.
Escape character is '^]'.
HEAD /images/logo_sm.gif HTTP/1.1
HOST: www.google.de
[nochmal ENTER drücken]
HTTP/1.1 200 OK
Content-Type: image/gif
Last-Modified: Mon, 25 Apr 2005 21:06:18 GMT
Expires: Sun, 17 Jan 2038 19:14:07 GMT
Server: GWS/2.1
Content-Length: 4707
Date: Mon, 23 Jan 2006 21:44:31 GMT
[nochmal ENTER drücken]
Connection closed by foreign host.
Die uns in diesem Beispiel interessierenden Daten:
Wir sehen, daß das Logo an dieser Adresse existiert, zuletzt am 25. April 2005 um 22:06 Uhr (GMT) geändert wurde (Last-Modified) und rund 4,7kByte groß ist (Content-Length).
Willst Du das Bild auch mit runterladen, ersetze einfach oben HEAD durch GET. Aber: Das Bild wird nicht gespeichert sondern die einzelnen Bytes werden direkt auf Deinem Monitor angezeigt - und das ergibt nur wirren Zeichensalat.
Scriptressourcen zu HEAD
Es gibt natürlich diverse Scripte zu dem Thema, darum hier nur eine Auswahl a la PHP:
+ LinkCheck von Johannes Froemter
+ PHP-Ressource.de: Einfacher TCP/IP Client mit HEAD
Soweit zum ersten Teil - Anregungen, Wünsche und Kritik sind gerne willkommen.
