HTTP: generarea antetului ETag

Cum pot genera un antet HTTP HTTP pentru un fișier de resurse?

0
fr hi bn

6 răspunsuri

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;
}
0
adăugat
În cazul meu, este pentru că a fost o cale calculată de la un program CGI. Ai dreptate că, în cazul unei căi directe, probabil că timpul ar fi suficient. Deoarece costul va fi în principal în stat (), nu există nicio taxă suplimentară pentru includerea inodului și dimensiunii, care ar putea proteja de cazul (destul de puțin probabil, desigur) în cazul în care un administrator necinstit ar putea actualiza un fișier și să-l atingă înapoi originalul mtime.
adăugat autor Mark Harrison, sursa
@MarkHarrison, de ce ai nevoie de ghilimele duble în jurul etagului? Este o parte mandatată a sintaxei?
adăugat autor Pacerier, sursa
Dacă mtime este momentul în care fișierul a fost modificat ultima dată, atunci care este scopul dimensiunii și inodului?
adăugat autor Steve, sursa

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!)

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

0
adăugat
Hmm, este o rușine, sper că se vor întoarce în curând, deoarece site-ul a fost o mină de aur de sfaturi!
adăugat autor Rich Bradshaw, sursa
adăugat autor buhtz, sursa
Linkul este acum înapoi.
adăugat autor Marius Gedminas, sursa
@RichBradshaw doar o întrebare, Cum putem cunoaște ultimul timbru de modificare a unei resurse? Este o operație manuală, după ce treceți prin istoricul modificărilor db? Sau există moduri automate?
adăugat autor Supun Wijerathne, sursa
linkul askapache este rupt
adăugat autor bskinnersf, sursa

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.

0
adăugat

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:

  1. nu necesită să îl calculați din nou pe fiecare condiție GET și
  2. nu se modifică dacă conținutul resursei nu sa modificat

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.

0
adăugat

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 ).

0
adăugat

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]
0
adăugat