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?
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
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;
}
}
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