Dajbych.net


Internet Explorer 9 a HTTP cache

, 5 minut čtení

Posky­tuje-li we­bová stránka da­tum poslední změny ob­sahu v HTTP hlav­ičce, může proh­líž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 proh­lížeče, se s poža­davkem pošle i její stáří. Server poté pošle ob­sah stránky jen v pří­padě, došlo-li mez­itím k její změně. V opačném pří­padě zašle jen hlav­ičku, která značí, že ke změně ne­došlo a ušetří se tak čas i síťový provoz.

De­vátá verze In­ter­net Ex­ploreru přináší vylepšení to­hoto chování. Nezbyt­nou součástí je však im­plementace ze strany dy­nam­ické we­bové ap­likace, která by měla posky­to­vat ale­spoň čas poslední změny ob­sahu. His­toricky má stat­ická stránka datum změny souboru – tedy i jeho ob­sahu. U dy­nam­ické však toto da­tum s je­jím ob­sa­hem ni­jak ne­sou­visí.

Nastavení z ASP.NET

Zjedn­odušeně řečeno, ASP.NET en­gine zpra­covává serverový skript, který vy­generuje HTML kód. Ten je pak uložen v cache na straně serveru, aby pro mnoho ste­jných poža­davků od různých klientů v krátkém čase stačilo zpra­co­vat skript pouze jed­nou. HTML kód je pak také uložen do cache na straně klienta, aby se na něko­lik ste­jných poža­davků krátce po sobě stačilo dota­zo­vat serveru jen je­denkrát. A po cestě se ještě může HTML stránka uk­lá­dat na proxy serveru. Ovlivnění, kde se stránka může a nemůže uk­lá­dat, se provádí přes me­todu Set­Cache­abil­ity:

Htt­p­Con­text.Cur­rent.Re­sponse.Cache.Set­Cache­abil­ity(Htt­p­Cache­abil­ity.ServerAnd­Pri­vate);

Téměř každý článek na webu ob­sahuje čas vy­dání, avšak málok­terý už posky­tuje tento čas v podobě čitelné pro cach­ing – tedy v HTTP hlav­ičce odezvy. Přitom stačí jed­iný řádek kódu:

Htt­p­Con­text.Cur­rent.Re­sponse.Cache.Set­Last­Mod­i­fied(ar­ti­cle.Mod­i­fied);

Me­toda Set­Last­Mod­i­fied bere jako svůj jed­iný ar­gu­ment čas poslední změny dy­nam­icky gen­erované stránky typu Date­Time. Ostatní sys­témy pak zařídí vše ostatní. Proh­lížeč odesílá poža­davek s hlav­ičkou If-Mod­i­fied-Since a IIS spolu s ASP.NET na ní adekvátně reagují.

Expires / max-age

Server může defi­no­vat čas plat­nosti stránky zasláním hlav­ičky max-age, je­jíž hod­nota vy­jadřuje počet sekund, po kterých je ob­sah stránky platný. Druhou možností je zaslání hlav­ičky Ex­pires, je­jíž hod­nota vy­jadřuje čas konce plat­nosti. Po je­jím uplynutí se proh­lížeč musí serveru dota­zo­vat, jestli její plat­nost stále trvá. Použije k tomu hlav­ičku If-Mod­i­fied-Since, ve které uvede čas posled­ního načtení stránky. Server na to může od­povědět HTTP/304 Not Mod­i­fied v pří­padě, že zjistí, že od té doby ke změně ne­došlo. Proh­lížeč pak použije stránku z cache a ušetří se přenos celé stránky.

ETag

ETag je hash ob­sahu stránky, který au­to­mat­icky generuje IIS. Proh­lížeč pak druhý dotaz na ste­j­nou URL do­provází hlav­ičkou If-None-Match, ve které uvádí ETag získaný po prvním poža­davku. Server poté může od­povědět HTTP/304 Not Mod­i­fied.

Vary

Může se stát, že vrácený ob­sah závisí na ně­jaké HTTP hlav­ičce, typ­icky Ac­cept-Lan­guage. Server může říct, že proh­lížeč smí použít stránku z cache, jen když jsou hlav­ičky uve­dené v hod­notě hlav­ičky Vary shodné. In­ter­net Ex­plorer 9 ig­noruje hod­noty Ac­cept-En­cod­ing a User-Agent hlav­ičky Vary, pro­tože ob­sah z cache je vždy dekom­p­ri­movaný a ob­sah stránky by neměl být závislý na použitém proh­lížeči.

Redirect

In­ter­net Ex­plorer 9 nyní uk­ládá do cache au­to­mat­icky stránky, které jen přes­měrová­vají. U přes­měrování 301 Moved Per­ma­nently se IE 9 chová tak, že stránku uloží se do cache, pokud to není zakázáno (Cache-Con­trol: no-cache). U přes­měrování 302 Found a 307 Tem­po­rary Redi­rect se uk­ládá se do cache jen te­hdy, je-li to po­v­oleno (Cache-Con­trol: max-age=120).

Zpět / vpřed

Upraveno je také chování při kliknutí na tlačítka zpět re­spek­tive vpřed. In­ter­net Ex­plorer 9 se chová po­dle normy RFC2616, která uvádí, že pokud uži­va­tel klikne na již zmíněná tlačítka, proh­lížeč by měl zo­brazit stránku z cache i když její plat­nost již vypršela. V tomto pří­padě se nebere zře­tel ani na hod­notu must-reval­i­date v hlav­ičce cache-con­trol. Nikdy se ale do cache neu­loží stránka, která to zakazuje (Cache-Con­trol: no-cache). Pokud však chcete stránku do cache uk­lá­dat jen pro použití v pří­padě nav­i­gace zpět či vpřed, stačí použít Cache-Con­trol: max-age=0.

Pokud server neřekne jinak

Mnoho serverů vůbec ne­speci­fikuje, kdy plat­nost stránky končí. V této si­tuaci se IE9 chová, na rozdíl od svých před­chůdců, opět po­dle RFC2616. V pří­padě, že server pošle ale­spoň hlav­ičku Last-Mod­i­fied, je doba plat­nost stránky vy­počtena takto:

max-age = (DownloadTime - LastModified) * 0.1

V pří­padě, že se server ani neobtěžuje s posíláním hlav­ičky Last-Mod­i­fied, je stránka po­važována za plat­nou po dobu dvanácti hodin nebo do zavření proh­lížeče; po­dle toho, co nas­tane dřív.