Zmiana znienacka czyli obsługa cache w Firefox 3.5 i 3.6

Pisałem kiedyś, że nie lubię zachowań specyficznych dla przeglądarki, między innymi w odniesieniu do document caching. Razem z pojawieniem się wersji 3.6 uległa zmianie obsługa tych nagłówków w Firefox.

Już tłumaczę o co chodzi. Tu na przykładzie PHP, ale taki zestaw nagłówków spotykałem też w przypadku aplikacji tworzonych w innych językach, więc problem może być bardziej powszechny. Na początek krótkie zapoznanie z sessioncachelimiter. I dla przykładu nagłówki zwracane przez mojego bloga (już to zmieniłem):

HTTP/1.1 200 OK Server: IdeaWebServer/v0.60 Date: Fri, 22 Jan 2010 07:56:57 GMT Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: private, max-age=10800, pre-check=10800 Last-Modified: Sat, 06 Jun 2009 10:40:01 GMT Vary: Accept-Encoding Content-Type: text/html; charset=UTF-8 Connection: Keep-Alive Content-Length: 63668

Jak widać nagłówki są zwracane według schematu private , czyli ustawiany jest nagłówek Cache-Control oraz Expires , przy czym nagłówek Expires pokazuje datę w przeszłości. Do tej pory Firefox w pierwszej kolejności uwzględniał nagłówek Expires , który jest ustawiany na odległą przeszłość. Czyli zwracana treść była traktowana jako już wygasła, a co za tym idzie nie uwzględniana przy obsłudze kolejnego żądania. W wersji 3.6 pierwszeństwo zyskują max-age oraz pre-check z Cache-Control. I tu okazuje się, że zachowanie kilku aplikacji dzięki tej zmianie stanie się nieprzewidywalne.

Do przykładu dotyczącego document caching dodałem wartości pre-check i max-age. Można sobie sprawdzić, że Firefox 3.5 po zaznaczeniu:

przeglądarka pobiera nową wersję strony. Ta sama kombinacja nagłówków w przypadku Firefox 3.6 powoduje wykorzystanie dokumentu z cache.

W sumie zmiana ta jest poprawna, a przynajmniej tak ja interpretuje ten fragment Hypertext Transfer Protocol — HTTP/1.1: Header Field Definitions:

If a response includes both an Expires header and a max-age directive, the max-age directive overrides the Expires header , even if the Expires header is more restrictive. This rule allows an origin server to provide, for a given response, a longer expiration time to an HTTP/1.1 (or later) cache than to an HTTP/1.0 cache. This might be useful if certain HTTP/1.0 caches improperly calculate ages or expiration times, perhaps due to desynchronized clocks.

Szybkie sprawdzenie innych przeglądarek (Internet Explorer 8, Chrome, Opera) pokazuje, że zachowują się właśnie w ten sposób – nagłówek Expires “przegrywa” z max-age.

Oryginał tego wpisu dostępny jest pod adresem Zmiana znienacka czyli obsługa cache w Firefox 3.5 i 3.6

Autor: Paweł Goleń