Vra

Hoe kan ek genereer 'n ETAG HTTP header vir 'n hulpbron lêer?

Was dit nuttig?

Oplossing

'n ETAG is 'n arbitrêre string wat die bediener stuur na die kliënt wat die kliënt terug sal stuur na die bediener die volgende keer die lêer aangevra.

Die ETAG moet berekenbaar op die bediener wat gebaseer is op die lêer wees. Soort van soos 'n checksum, maar jy kan nie wil checksum elke lêer stuur dit uit.

 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)

Ek opgebou 'n string in die formaat "lêer inode aantal / datum stempel / lêer grootte". Dus, as 'n lêer verander op die bediener nadat dit uit gedien om die kliënt, die nuut herskep ETAG sal nie ooreen as die kliënt weer versoeke dit.

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

Ander wenke

Solank dit verander wanneer die hulpbron verteenwoordiging veranderinge, hoe jy produseer dit is heeltemal aan jou.

Jy moet probeer om dit te produseer in 'n manier wat addisioneel:

  1. is dit nie nodig om weer te bereken dit op elke voorwaardelike te kry, en
  2. nie verander as die inhoud hulpbron nie verander

Die gebruik van hashes van inhoud kan veroorsaak dat jy om te misluk op # 1 as jy nie die berekende hashes slaan saam met die lêers.

Die gebruik van inode getalle kan jy laat ontbreek by # 2 as jy jou lêerstelsel te herrangskik of jy dien inhoud van verskeie bedieners.

Een meganisme wat kan werk is om iets heeltemal inhoud afhanklik soos 'n SHA-1 hash of 'n weergawe string, bereken en sodra gestoor gebruik wanneer jou hulpbron inhoud verander.

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

  

By verstek, beide Apache en IIS insluit data in die ETAG wat dramaties verminder die kans van die geldigheid toets slaag op webwerwe met verskeie bedieners.

     

...

     

As jy nie gebruik te maak van die buigsame validering model wat ETags bied, is dit beter om net te verwyder die ETAG geheel en al.

Die standaard apache ETAG in bash genereer

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

Selfs wanneer ek was op soek na iets presies soos die ETAG (die leser vra vir 'n lêer slegs indien dit verander het oor die bediener), dit nooit gewerk en ek het met behulp van 'n AOO truuk (die toevoeging van 'n tyd stempel as 'n get argument te die JS lêers).

Ive been met behulp van Adler-32 as 'n html skakel shortener. Ek is nie seker of dit 'n goeie idee, maar tot dusver, havent het ek opgelet enige duplikate. Dit kan werk as 'n ETAG kragopwekker. En dit moet vinniger dan probeer om hash met behulp van 'n enkripsie skema soos sha wees, maar ek havent hierdie geverifieer. Die kode wat ek gebruik is:

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

Ek sou nie raai die gebruik van hulle en gaan vir laaste wysiging kop in plaas.

Askapache het 'n nuttige artikel oor hierdie. (As hulle pretty much alles lyk dit!)

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

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top