Question

Comment générer un en-tête HTTP ETag pour un fichier de ressources ?

Était-ce utile?

La solution

Un etag est une chaîne arbitraire que le serveur envoie au client et que le client renverra au serveur la prochaine fois que le fichier sera demandé.

L'étiquette etag doit être calculable sur le serveur en fonction du fichier.Un peu comme une somme de contrôle, mais vous ne voudrez peut-être pas faire la somme de contrôle de chaque fichier qui l'envoie.

 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)

J'ai construit une chaîne au format "numéro d'inode de fichier/horodatage/taille du fichier".Ainsi, si un fichier est modifié sur le serveur après avoir été distribué au client, l'étiquette nouvellement régénérée ne correspondra pas si le client le demande à nouveau.

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

Autres conseils

Tant que cela change à chaque fois que la représentation des ressources change, la manière dont vous la produisez dépend entièrement de vous.

Vous devriez essayer de le produire de manière à :

  1. ne vous oblige pas à le recalculer à chaque GET conditionnel, et
  2. ne change pas si le contenu de la ressource n'a pas changé

L'utilisation de hachages de contenu peut entraîner un échec au niveau 1 si vous ne stockez pas les hachages calculés avec les fichiers.

L'utilisation de numéros d'inodes peut entraîner un échec au niveau 2 si vous réorganisez votre système de fichiers ou si vous diffusez du contenu à partir de plusieurs serveurs.

Un mécanisme qui peut fonctionner consiste à utiliser quelque chose entièrement dépendant du contenu, comme un hachage SHA-1 ou une chaîne de version, calculé et stocké une fois à chaque fois que le contenu de votre ressource change.

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

Par défaut, Apache et IIS intègrent des données dans l'ETag, ce qui réduit considérablement les chances de réussite du test de validité sur les sites Web dotés de plusieurs serveurs.

...

Si vous ne profitez pas du modèle de validation flexible fourni par les ETags, il est préférable de simplement supprimer complètement l'ETag.

Comment générer l'étiquette Apache par défaut dans 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

Même lorsque je cherchais quelque chose exactement comme l'etag (le navigateur demande un fichier uniquement s'il a changé sur le serveur), cela n'a jamais fonctionné et j'ai fini par utiliser une astuce GET (en ajoutant un horodatage comme argument get aux fichiers js ).

J'utilise Adler-32 comme raccourcisseur de lien HTML.Je ne sais pas si c'est une bonne idée, mais jusqu'à présent, je n'ai remarqué aucun doublon.Cela peut fonctionner comme un générateur d'étiquettes.Et cela devrait être plus rapide que d'essayer de hacher en utilisant un système de cryptage comme sha, mais je ne l'ai pas vérifié.Le code que j'utilise est :

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

Je recommanderais de ne pas les utiliser et d'opter plutôt pour les en-têtes de dernière modification.

Askapache a un article utile à ce sujet.(comme ils font à peu près tout ce qu'il semble !)

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top