Cum pot genera un antet HTTP HTTP pentru un fișier de resurse?
Un etag este un șir arbitrar pe care serverul îl trimite clientului pe care clientul îl va trimite înapoi la server data viitoare când se solicită fișierul.
Etapa trebuie să fie calculată pe server pe baza fișierului. S-ar putea ca o sumă de control, dar s-ar putea să nu doriți să verificați fiecare fișier care îl trimite.
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)
Am construit un șir în format "file inode number / datestamp / size file". Deci, dacă un fișier este schimbat pe server după ce acesta a fost difuzat clientului, etapa nou regenerată nu se va potrivi dacă clientul o solicită din nou.
char *mketag(char *s, struct stat *sb) { sprintf(s, "%d/%d/%d", sb->st_ino, sb->st_mtime, sb->st_size); return s; }
De la http://developer.yahoo.com/performance/rules.html#etags:
În mod implicit, atât datele din Apache, cât și cele de pe IIS încorporează date în ETag, care reduc în mod drastic șansele testului de validitate pe site-urile web cu mai multe servere.
...
Dacă nu profitați de modelul flexibil de validare oferit de ETags, este mai bine să eliminați complet ETAG-ul.
Atâta timp cât se schimbă ori de câte ori se schimbă reprezentarea resurselor, modul în care o produceți este total dependentă de dvs.
Ar trebui să încercați să o produceți într-un mod care, în plus:
Utilizarea conținuturilor de conținut poate determina eșecul la # 1 dacă nu stocați hashes-ul calculat împreună cu fișierele.
Folosirea numerelor inode poate duce la eșec la # 2 dacă rearanjați sistemul de fișiere sau dacă difuzați conținut de pe mai multe servere.
Un mecanism care poate funcționa este de a folosi ceva complet dependent de conținut, cum ar fi un hash SHA-1 sau un șir de versiuni, calculat și stocat o dată la fiecare modificare a conținutului resurselor.
Aș recomanda să nu le folosiți și să mergeți pentru anteturi modificate ultima dată.
Askapache are un articol util pe această temă. (așa cum fac aproape orice se pare!)
Cum se generează apache etag implicit în 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
Chiar și atunci când căutam ceva exact ca etag (browserul cere un fișier numai dacă s-a schimbat pe server), nu a funcționat niciodată și am încheiat folosind un truc GET (adăugând o marcă de timp ca argument pentru a obține fișierele js ).
Am folosit Adler-32 ca o scurtătură de linkuri html. Nu sunt sigur dacă aceasta este o idee bună, dar până acum am observat că există duplicate. Poate funcționa ca un generator de etape. Și ar trebui să fie mai rapid decât încercarea de a hash folosind o schemă de criptare ca sha, dar eu nu am verificat acest lucru. Codul pe care îl folosesc este:
shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]