Dajbych.net


Internet Explorer 9 a HTTP cache

, 6 minut čtení

Po­sky­tuje-li we­bová stránka da­tum po­slední změny ob­sahu v HTTP hla­vičce, může pro­hlí­žeč vyu­žít pod­mí­ně­ného HTTP po­ža­davku. V pří­padě žá­dosti o stránku, která už je ulo­žena v cache pro­hlí­žeče, se s po­ža­dav­kem po­šle i její stáří. Ser­ver poté po­šle ob­sah stránky jen v pří­padě, do­šlo-li me­zi­tím k její změně. V opač­ném pří­padě za­šle jen hla­vičku, která značí, že ke změně ne­do­šlo a ušetří se tak čas i sí­ťový pro­voz.

De­vátá verze In­ter­net Ex­plo­reru při­náší vylep­šení to­hoto cho­vání. Ne­zbyt­nou sou­částí je však im­plementace ze strany dy­na­mické we­bové apli­kace, která by měla po­sky­to­vat ale­spoň čas po­slední změny ob­sahu. His­to­ricky má sta­tická stránka datum změny sou­boru – tedy i jeho ob­sahu. U dy­na­mické však toto da­tum s jejím ob­sahem ni­jak ne­sou­visí.

Nastavení z ASP.NET

Zjed­no­du­šeně ře­čeno, ASP.NET en­gine zpra­co­vává ser­ve­rový skript, který vy­ge­ne­ruje HTML kód. Ten je pak ulo­žen v cache na straně ser­veru, aby pro mnoho stej­ných po­ža­davků od různých kli­entů v krát­kém čase sta­čilo zpra­co­vat skript pouze jed­nou. HTML kód je pak také ulo­žen do cache na straně kli­enta, aby se na ně­ko­lik stej­ných po­ža­davků krátce po sobě sta­čilo do­ta­zo­vat ser­veru jen je­den­krát. A po cestě se ještě může HTML stránka uklá­dat na proxy ser­veru. Ovliv­nění, kde se stránka může a ne­může uklá­dat, se pro­vádí přes me­todu Set­Ca­che­a­bi­lity:

Http­Con­text.Current.Re­sponse.Cache.Set­Ca­che­a­bi­lity(Http­Ca­che­a­bi­lity.Ser­ve­rAn­d­Pri­vate);

Téměř každý člá­nek na webu ob­sahuje čas vy­dání, avšak má­lokterý už po­sky­tuje tento čas v po­době či­telné pro caching – tedy v HTTP hla­vičce odezvy. Při­tom stačí je­diný řá­dek kódu:

Http­Con­text.Current.Re­sponse.Cache.SetLast­Mo­di­fied(ar­ticle.Mo­di­fied);

Me­toda SetLast­Mo­di­fied bere jako svůj je­diný ar­gu­ment čas po­slední změny dy­na­micky ge­ne­ro­vané stránky typu Da­te­Time. Ostatní systémy pak za­řídí vše ostatní. Pro­hlí­žeč ode­sílá po­ža­da­vek s hla­vič­kou If-Mo­di­fied-Since a IIS spolu s ASP.NET na ní ade­kvátně re­a­gují.

Expires / max-age

Ser­ver může de­fi­no­vat čas plat­nosti stránky za­slá­ním hla­vičky max-age, jejíž hod­nota vyja­dřuje po­čet sekund, po kterých je ob­sah stránky platný. Druhou mož­ností je za­slání hla­vičky Ex­pi­res, jejíž hod­nota vyja­dřuje čas konce plat­nosti. Po jejím uply­nutí se pro­hlí­žeč musí ser­veru do­ta­zo­vat, jestli její plat­nost stále trvá. Po­u­žije k tomu hla­vičku If-Mo­di­fied-Since, ve které uvede čas po­sled­ního na­čtení stránky. Ser­ver na to může od­po­vě­dět HTTP/304 Not Mo­di­fied v pří­padě, že zjistí, že od té doby ke změně ne­do­šlo. Pro­hlí­žeč pak po­u­žije stránku z cache a ušetří se pře­nos celé stránky.

ETag

ETag je hash ob­sahu stránky, který au­to­ma­ticky ge­ne­ruje IIS. Pro­hlí­žeč pak druhý do­taz na stej­nou URL do­pro­vází hla­vič­kou If-None-Match, ve které uvádí ETag získaný po prv­ním po­ža­davku. Ser­ver poté může od­po­vě­dět HTTP/304 Not Mo­di­fied.

Vary

Může se stát, že vrácený ob­sah zá­visí na ně­jaké HTTP hla­vičce, ty­picky Ac­cept-Lan­guage. Ser­ver může říct, že pro­hlí­žeč smí po­u­žít stránku z cache, jen když jsou hla­vičky uve­dené v hod­notě hla­vičky Vary shodné. In­ter­net Ex­plo­rer 9 ig­no­ruje hod­noty Ac­cept-En­co­ding a User-Agent hla­vičky Vary, pro­tože ob­sah z cache je vždy de­kom­pri­mo­vaný a ob­sah stránky by ne­měl být zá­vislý na po­u­ži­tém pro­hlí­žeči.

Redirect

In­ter­net Ex­plo­rer 9 nyní ukládá do cache au­to­ma­ticky stránky, které jen pře­smě­ro­vá­vají. U pře­smě­ro­vání 301 Mo­vedPer­ma­nently se IE 9 chová tak, že stránku uloží se do cache, po­kud to není za­ká­záno (Cache-Con­t­rol: no-cache). U pře­smě­ro­vání 302 Found a 307 Tem­po­raryRe­di­rect se ukládá se do cache jen tehdy, je-li to po­vo­leno (Cache-Con­t­rol: max-age=120).

Zpět / vpřed

Upra­veno je také cho­vání při klik­nutí na tla­čítka zpět re­spek­tive vpřed. In­ter­net Ex­plo­rer 9 se chová podle normy RFC2616, která uvádí, že po­kud uži­va­tel klikne na již zmí­něná tla­čítka, pro­hlí­žeč by měl zob­ra­zit stránku z cache i když její plat­nost již vy­pr­šela. V tomto pří­padě se ne­bere zře­tel ani na hod­notu must-re­va­li­date v hla­vičce cache-con­t­rol. Ni­kdy se ale do cache ne­uloží stránka, která to za­ka­zuje (Cache-Con­t­rol: no-cache). Po­kud však chcete stránku do cache uklá­dat jen pro po­u­žití v pří­padě na­vi­gace zpět či vpřed, stačí po­u­žít Cache-Con­t­rol: max-age=0.

Pokud server neřekne jinak

Mnoho ser­verů vů­bec ne­spe­ci­fikuje, kdy plat­nost stránky končí. V této si­tuaci se IE9 chová, na roz­díl od svých před­chůdců, opět podle RFC2616. V pří­padě, že ser­ver po­šle ale­spoň hla­vičku Last-Mo­di­fied, je doba plat­nost stránky vy­poč­tena takto:

max-age = (DownloadTime - LastModified) * 0.1

V pří­padě, že se ser­ver ani ne­ob­tě­žuje s po­sílá­ním hla­vičky Last-Mo­di­fied, je stránka po­va­žo­vána za plat­nou po dobu dva­nácti ho­din nebo do za­vření pro­hlí­žeče; podle toho, co na­stane dřív.