Frage

Wie erstelle ich einen ETag-HTTP-Header für eine Ressourcendatei?

War es hilfreich?

Lösung

Ein Etag ist eine beliebige Zeichenfolge, die der Server an den Client sendet und die der Client bei der nächsten Anforderung der Datei an den Server zurücksendet.

Das Etag sollte auf dem Server basierend auf der Datei berechenbar sein.So etwas wie eine Prüfsumme, aber Sie möchten möglicherweise nicht jede Datei, die sie sendet, prüfen.

 server                client

        <------------- request file foo

 file foo etag: "xyz"  -------->

        <------------- request file foo
                       etag: "xyz" (what the server just sent)

 (the etag is the same, so the server can send a 304)

Ich habe eine Zeichenfolge im Format „Datei-Inode-Nummer/Datumsstempel/Dateigröße“ erstellt.Wenn also eine Datei auf dem Server geändert wird, nachdem sie dem Client bereitgestellt wurde, stimmt das neu generierte Etag nicht überein, wenn der Client es erneut anfordert.

char *mketag(char *s, struct stat *sb)
{
    sprintf(s, "%d/%d/%d", sb->st_ino, sb->st_mtime, sb->st_size);
    return s;
}

Andere Tipps

Solange es sich ändert, wenn sich die Ressourcendarstellung ändert, liegt es ganz bei Ihnen, wie Sie es produzieren.

Sie sollten versuchen, es so zu produzieren, dass zusätzlich:

  1. erfordert nicht, dass Sie es bei jedem bedingten GET neu berechnen, und
  2. ändert sich nicht, wenn sich der Ressourceninhalt nicht geändert hat

Die Verwendung von Inhalts-Hashes kann dazu führen, dass Sie bei Punkt 1 scheitern, wenn Sie die berechneten Hashes nicht zusammen mit den Dateien speichern.

Die Verwendung von Inode-Nummern kann dazu führen, dass Sie bei Nr. 2 scheitern, wenn Sie Ihr Dateisystem neu anordnen oder Inhalte von mehreren Servern bereitstellen.

Ein Mechanismus, der funktionieren kann, besteht darin, etwas völlig inhaltsabhängiges wie einen SHA-1-Hash oder eine Versionszeichenfolge zu verwenden, der einmal berechnet und gespeichert wird, wenn sich der Inhalt Ihrer Ressource ändert.

Aus http://developer.yahoo.com/performance/rules.html#etags:

Sowohl Apache als auch IIS betten standardmäßig Daten in den ETag ein, was die Wahrscheinlichkeit, dass der Gültigkeitstest auf Websites mit mehreren Servern erfolgreich ist, drastisch verringert.

...

Wenn Sie das flexible Validierungsmodell von ETags nicht nutzen, ist es besser, das ETag einfach ganz zu entfernen.

So generieren Sie das Standard-Apache-Etag in Bash

for file in *; do printf "%x-%x-%x\t$file\n" `stat -c%i $file` `stat -c%s $file` $((`stat -c%Y $file`*1000000)) ; done

Selbst als ich nach etwas genau wie dem etag suchte (der Browser fragt nur nach einer Datei, wenn sie sich auf dem Server geändert hat), hat es nie funktioniert und ich habe aufgehört, einen GET-Trick zu verwenden (Hinzufügen eines Zeitstempels als get-Argument zu den js-Dateien). ).

Ich habe Adler-32 als HTML-Link-Shortener verwendet.Ich bin mir nicht sicher, ob das eine gute Idee ist, aber bisher sind mir keine Duplikate aufgefallen.Es kann als Etag-Generator funktionieren.Und es sollte schneller sein als der Versuch, einen Hash mit einem Verschlüsselungsschema wie SHA durchzuführen, aber ich habe dies nicht überprüft.Der Code, den ich verwende, ist:

 shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]

Ich würde empfehlen, sie nicht zu verwenden und stattdessen die zuletzt geänderten Header zu verwenden.

Askapache hat einen nützlichen Artikel dazu.(da sie scheinbar so ziemlich alles tun!)

http://www.askapache.com/htaccess/apache-speed-etags.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top