eddi: HTTP HEAD und Last-Modified

Beitrag lesen

Hallo,

Das E-Tag habe ich in seiner Bedeutung nicht verstanden, da mir die Erläuterungen in den Specs zu unverständlich waren.

ETag dient wohl mehr dazu, mehrere Entitäten, also Ausprägungen o.ä., einer Ressource zu unterscheiden.

exakt! Der Header "Last-Modified" bestimmt lediglich die letzte Ändereung einer Resource. Folgendes Script würde also zu unerwünsten Verhalten führen:

  
clearstatcache();  
$f='robots.txt';  
$t=filectime($f);  
$d=fopen($f,'a');  
fwrite($d,' ');  
fclose($d);  
touch($f,$t);

Das _kann_ wohl auch zur Bewertung der Aktualität der Ressource bzgl. des aktuellen Timestamps dienen, wie im vorliegenden Falle, wenn man eigentlich eine 304 Not Modified-Antwort umsetzen will - es gibt aber wohl noch andere Einsatzgebiete.

Dadurch, daß sich der Header "ETag" beim Beispiel apache aus INode MTime Size zusammensetzt, wird eine Veränderung, die das kleine Script vorgenommen hat, dennoch erkannt. Der Header ist also erheblich verläßlicher.
 Andere Einsatzgebiete sind mir nicht bekannt.

Manche Clients benutzen den Last-Modified-Header, um darauf hin bei der erneuten Anfrage ein If-Modified-Since zu generieren, um zu erfragen, ob sich die Ressource inzwischen gegenüber der gechachten Version verändert hat - manche Clients aber wohl auch den ETag.

So z. B. FF und Moz während Opera, IE und links hier weder "If-Modified-Since" oder "If-None-Match" senden.

...ETag ebenfalls zu implementieren, kann man sich da also u.U. sparen.

Da dynamisch generierte Dokumnente mit unterschiedlichen Parametern arbeiten ($_GET,$_POST, etc.) und demzufolge auch unterschiedliche Ausgaben erzeugen, wird es auf ein Ausgabepufferung hinauslaufen müssen. Ist das Dokument soweit erstellt könnte man mit md5 eine Prüfsumme ziehen und diese als Wert des ETag-Headers verwenden. Dumm nur: Den Header Content-MD5 gibt es auch und wird vom Server gebildet, sodaß man sich den Zirkus mit Ausgabepufferung sparen könnte. Er wäre der eindeutigste Anhaltspunkt für die Aktualität eines Dokuments, wird aber von keinem Browser dafür genutzt.

Beim Gebrauch eines Hashs kommt der eigentliche Vorteil dieses Headers zum tragen. Er ist nicht an eine strikte Formatierung gebunden und kann also aufnehmen, was er will.

Diese Abschnitte hatte ich verstanden und Last-Modified davon umgesetzt. Bei If-Modified-Since und ETag ist mir nicht klar geworden, wofür ich die genau einsetzen sollte, bzw. welche Information ich mit diesen Headern schicken müsste.

CLIENT: [Erstanfrage]
SERVER: Last-Modified: Thu, 09 Mar 2006 17:27:56 GMT
CLIENT: If-Modified-Since: Thu, 09 Mar 2006 17:27:56 GMT

CLIENT: [Erstanfrage]
SERVER: ETag: "1b-40e93326f9f00"
CLIENT: If-None-Match: "1b-40e93326f9f00"

Die Mechanismen sind also analog zu einander.

Gruß aus Berlin!
eddi