Make IE to Cache resources but always rewalidate

Nagłówek kontrolny pamięci podręcznej "no-cache, must-revalidate, private" pozwala przeglądarkom buforować zasób, ale wymusza ponowną walidację z żądaniami warunkowymi. Działa to zgodnie z oczekiwaniami w przeglądarkach FF, Safari i Chrome.

IE7 + 8 nie wysyła warunkowego żądania, czyli" If-Modified-Since " brakuje w nagłówku żądania i dlatego serwer odpowiada HTTP / 200 zamiast HTTP / 304.

Oto pełne nagłówki odpowiedzi serwera:

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Content-type: text/html;charset=utf-8
Content-Length: 10835
Date: Wed, 16 Feb 2011 13:52:26 GMT
Connection: keep-alive
Cache-Control: no-cache, must-revalidate, private

To wygląda na błąd IE, ale nie znalazłem w sieci nic związanego, więc zastanawiam się, czy może brak lub istnienie innego nagłówka sprawia, że IE zachowuje się dziwnie?

Dobra dyskusja na temat różnicy między no-cache i max-age: Jaka jest różnica między Cache-Control: max-age=0 i no-cache?

Author: Community, 2011-02-16

2 answers

W końcu to rozgryzłem. Oto wyjaśnienie i sprawdzone rozwiązanie.

Następująca strona potwierdza moje spostrzeżenie: http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/

Mówi, że IE nie przechowuje lokalnie stron z dyrektywą 'no-cache' i dlatego zawsze wysyła bezwarunkowe żądanie.

Jest też artykuł MS support - https://support.microsoft.com/help/234067 / - co potwierdza to:

"Internet Explorer obsługuje nagłówek HTTP 1.1 Cache-Control, który zapobiega buforowaniu określonego zasobu sieciowego, gdy podana jest wartość no-cache..."

To zachowanie nie jest całkowicie błędne -- ale nie jest to, co zamierzał RFC 2616 (sec. 14.9.1). O "no-cache "pisze"... pamięć podręczna nie może korzystać z odpowiedzi w celu spełnienia kolejnego żądania bez pomyślnego przedłużenia ważności z serwerem origin."Więc odpowiedź może być buforowana, ale musi ją ponownie zatwierdzić. Major przeglądarki, z wyjątkiem IE, buforują odpowiedź i aktualizują ją. Aby zapobiec przechowywaniu żądania, istnieje dyrektywa "no-store" Cache-Control.

podsumowując, IE traktuje "no-cache "jako" no-store".

A oto rozwiązanie pozwalające w spójny sposób włączyć żądania warunkowe dla IE i innych przeglądarek:

Nie używaj no-cache, ale zamiast tego Ustaw nagłówek Expires na past (lub -1, co ma ten sam efekt). IE, a także inne główne przeglądarki, będą następnie wysyłać żądania warunkowe. (Uwaga, powinieneś również być świadomy błędu nagłówka Ie Vary, który zapobiega buforowaniu.)

Oto krytyczne pola nagłówka:

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private
    Jako walidator potrzebny jest ostatnio zmodyfikowany (lub ETag)]}
  • wygasa -1 mówi, że zasób jest przestarzały i musi zostać odnowiony
  • Cache-Control nie może zawierać no-cache ani no-store
 69
Author: alienhard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 06:10:59
   $last_modified = filemtime($_SERVER['SCRIPT_FILENAME']);

   session_cache_limiter(FALSE);

   header("Content-Type: text/css");
   header("Cache-Control: max-age=1, must-revalidate, private");
   header("Last-Modified: " . gmdate("D, d M Y H:i:s", $last_modified) . " GMT");

   if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"]))
   {
      if(strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"]) >= $last_modified)
      {
         header("HTTP/1.1 304 Not Modified");
         exit;
      }
   }
 -2
Author: danielb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-05 00:05:19