HTTP: ETag-Header erzeugen

6 answers
  • Solange sich diese Änderung ändert, wenn sich die Ressourcendarstellung ändert, liegt es ganz bei Ihnen, wie Sie sie produzieren.

    Sie sollten versuchen, diese so zu erstellen Zusätzlich:

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

    Die Verwendung von Hashes von Inhalten kann dazu führen, dass Sie an # 1 fehlschlagen, wenn Sie die berechneten Hashes nicht speichern zusammen mit den Dateien.

    Die Verwendung von Inode-Nummern kann zu Fehlern bei # 2 führen, wenn Sie Ihr Dateisystem neu anordnen oder Inhalte von mehreren Servern bereitstellen.

    Ein Mechanismus, der funktionieren kann, ist die Verwendung eines vollständig inhaltsabhängigen Elements, z. B. eines SHA-1-Hashs oder einer Versionszeichenfolge, das einmal berechnet und gespeichert wird, wenn sich der Ressourceninhalt ändert.

    09 August 2008
    Justin Sheehy
  • Ein etag ist eine beliebige Zeichenfolge, die der Server an den Client sendet, die der Client bei der nächsten Anforderung der Datei an den Server zurücksendet.

    Die etag sollte auf dem Server basierend auf der Datei berechenbar sein. So ähnlich wie eine Prüfsumme, aber Sie möchten vielleicht nicht, dass jede Datei mit einer Prüfsumme versendet wird.

      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)
     

    habe ich erstellt Einen String im Format "Datei-Inode-Nummer / Datumsstempel / Dateigröße" einrichten. Wenn also eine Datei auf dem Server geändert wird, nachdem sie an den Client geliefert wurde, stimmt der neu generierte etag nicht überein, wenn der Client sie erneut anfordert.

     char * mketag (Zeichen * s, struct stat * sb) 
     {
     sprintf (s, "% d /% d /% d"), sb- & gt; st_ino, sb- & gt; st_mtime, sb- & gt; st_size); 
     return s; 
    } 
     
    26 April 2014
    Juan Campa
  • Über http://developer.yahoo.com/performance/rules. html # etags :

    Standardmäßig werden sowohl Apache als auch IIS Daten in den ETag einbetten, wodurch die Wahrscheinlichkeit eines erfolgreichen Gültigkeitstests drastisch reduziert wird Websites mit mehreren Servern.

    ...

    Wenn Sie das von ETags bereitgestellte flexible Validierungsmodell nicht nutzen, sollten Sie es einfach entfernen das ETag zusammen.

    07 August 2008
    grom
  • So erstellen Sie den 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
     

    Auch wenn ich danach gesucht habe Etwas genau wie der etag (der Browser fragt nur nach einer Datei, wenn sie sich auf dem Server geändert hat), es hat nie funktioniert und ich habe einen GET-Trick beendet (Hinzufügen eines Zeitstempels als Get-Argument zu den js-Dateien)

    05 September 2011
    lolesque
  • Ich habe Adler-32 als HTML-Link-Shortener verwendet. Ich bin nicht sicher, ob dies eine gute Idee ist, aber bisher habe ich keine Duplikate bemerkt. Es kann als Etag-Generator arbeiten. Und es sollte schneller sein als der Versuch, mit einem Verschlüsselungsschema wie sha zu Hashing, aber ich habe das nicht überprüft. Der von mir verwendete Code ist:

      shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]
     
    27 December 2012
    peawormsworth
  • 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 so ziemlich alles tun, scheint es!)

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

    20 September 2008
    Rich Bradshaw