Jak kontrolujemy buforowanie stron internetowych we wszystkich przeglądarkach?
Nasze badania wykazały, że nie wszystkie przeglądarki szanują dyrektywy pamięci podręcznej HTTP w jednolity sposób.
Ze względów bezpieczeństwa nie chcemy, aby niektóre strony w naszej aplikacji były buforowane, kiedykolwiek, przez przeglądarkę internetową. To musi działać przynajmniej dla następujących przeglądarek:
- Internet Explorer 6 +
- Firefox 1.5+
- Safari 3+
- Opera 9 +
- Chrome
Nasze wymagania wynikały z testu bezpieczeństwa. Po wylogowaniu się z naszej strony internetowej możesz nacisnąć przycisk Wstecz i wyświetlić buforowane strony.
29 answers
Wprowadzenie
Poprawny minimalny zestaw nagłówków, który działa we wszystkich wymienionych klientach (i proxy):
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
The Cache-Control
jest zgodne ze specyfikacją HTTP 1.1 Dla klientów i proxy (i domyślnie wymagane przez niektórych klientów obok Expires
). Na Pragma
jest wg specyfikacji HTTP 1.0 Dla klientów. Na Expires
jest zgodne ze specyfikacją HTTP 1.0 i 1.1 Dla klientów i serwerów proxy. W HTTP 1.1, Cache-Control
ma pierwszeństwo przed Expires
, więc w końcu tylko dla proxy HTTP 1.0.
Jeśli nie zależy ci na IE6 i jego zepsutym buforowaniu podczas obsługi stron przez HTTPS tylko no-store
, możesz pominąć Cache-Control: no-cache
.
Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0
Jeśli nie zależy ci na IE6 ani klientach HTTP 1.0( HTTP 1.1 został wprowadzony w 1997 roku), możesz pominąć Pragma
.
Cache-Control: no-store, must-revalidate
Expires: 0
Jeśli nie dbasz o proxy HTTP 1.0, możesz pominąć Expires
.
Cache-Control: no-store, must-revalidate
Z drugiej strony, jeśli serwer automatycznie zawiera poprawny nagłówek Date
, możesz teoretycznie pomijaj też Cache-Control
i polegaj tylko na Expires
.
Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0
Ale może się to nie udać, jeśli np. użytkownik końcowy manipuluje datą systemu operacyjnego, a oprogramowanie klienckie opiera się na niej.
Inne parametry Cache-Control
, takie jak max-age
, nie mają znaczenia, jeśli podane są wyżej wymienione parametry Cache-Control
. Na Last-Modified
nagłówek zawarty w większości innych odpowiedzi jest tylko interesujące, jeśli rzeczywiście chcesz buforować żądanie, więc nie musisz określać w ogóle.
Jak to ustawić?
Using PHP:
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.
Za pomocą Java Servlet lub Node.js:
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.
Korzystanie z ASP. NET-MVC
Response.Cache.SetCacheability(HttpCacheability.NoCache); // HTTP 1.1.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
Za pomocą ASP.NET Web API:
// `response` is an instance of System.Net.Http.HttpResponseMessage
response.Headers.CacheControl = new CacheControlHeaderValue
{
NoCache = true,
NoStore = true,
MustRevalidate = true
};
response.Headers.Pragma.ParseAdd("no-cache");
// We can't use `response.Content.Headers.Expires` directly
// since it allows only `DateTimeOffset?` values.
response.Content?.Headers.TryAddWithoutValidation("Expires", 0.ToString());
Za pomocą ASP.NET:
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
Za pomocą ASP.NET Core v3
// using Microsoft.Net.Http.Headers
Response.Headers[HeaderNames.CacheControl] = "no-cache, no-store, must-revalidate";
Response.Headers[HeaderNames.Expires] = "0";
Response.Headers[HeaderNames.Pragma] = "no-cache";
Użycie ASP:
Response.addHeader "Cache-Control", "no-cache, no-store, must-revalidate" ' HTTP 1.1.
Response.addHeader "Pragma", "no-cache" ' HTTP 1.0.
Response.addHeader "Expires", "0" ' Proxies.
[[42]}Korzystanie z Ruby on Rails, lub Python / Flask:
headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
headers["Expires"] = "0" # Proxies.
Używanie Pythona / Django:
response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.
Używanie Pythona / Pyramid:
request.response.headerlist.extend(
(
('Cache-Control', 'no-cache, no-store, must-revalidate'),
('Pragma', 'no-cache'),
('Expires', '0')
)
)
Użycie Go:
responseWriter.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1.
responseWriter.Header().Set("Pragma", "no-cache") // HTTP 1.0.
responseWriter.Header().Set("Expires", "0") // Proxies.
Używanie Apache .htaccess
plik:
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
Użycie HTML:
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
Znaczniki META HTML vs nagłówki odpowiedzi HTTP
Ważne jest, aby wiedzieć, że gdy strona HTML jest obsługiwana przez połączenie HTTP, a nagłówek jest obecny w zarówno w nagłówkach odpowiedzi HTTP, jak i znacznikach HTML<meta http-equiv>
, to ten określony w nagłówku odpowiedzi HTTP będzie miał pierwszeństwo przed meta tagiem HTML. Meta tag HTML będzie używany tylko wtedy, gdy strona jest wyświetlana z lokalnego systemu plików na dysku za pomocą adresu URL file://
.
Ogólnie rzecz biorąc, lepiej po prostu , a nie określać meta tagi HTML, aby uniknąć nieporozumień przez starterów i polegać na twardych nagłówkach odpowiedzi HTTP. Ponadto, w szczególności te <meta http-equiv>
tagi są invalid w HTML5. Tylko wartości http-equiv
wymienione w specyfikacji HTML5 są dozwolone.
Aby zweryfikować jedno i drugie, możesz zobaczyć / debugować je w monitorze ruchu HTTP w zestawie narzędzi programistycznych webbrowser. Możesz tam dotrzeć, naciskając F12 w Chrome / Firefox23 + / IE9+, a następnie otwierając panel" sieć "lub" Net", a następnie klikając interesujące żądanie HTTP, aby odkryć wszystkie szczegóły dotyczące żądania HTTP i odpowiedzi. Zrzut ekranu pochodzi z Chrome:
Chcę ustaw te nagłówki również w plikach do pobrania
Po pierwsze, to pytanie i odpowiedź są ukierunkowane na "strony internetowe "(strony HTML), a nie" Pliki do pobrania " (PDF, zip, Excel, itp.). Lepiej mieć je w pamięci podręcznej i użyć jakiegoś identyfikatora wersji pliku gdzieś w ścieżce URI lub querystring, aby wymusić ponowne pobranie zmienionego pliku. Podczas stosowania nagłówków bez pamięci podręcznej przy pobieraniu plików, uważaj na błąd IE7 / 8 podczas serwowania pobierania plików przez HTTPS zamiast HTTP. Szczegółowe informacje: IE nie może pobrać foo.jsf. IE nie był w stanie otworzyć tej strony internetowej. Żądana strona jest niedostępna lub nie można jej znaleźć.
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
2020-10-24 13:02:58
(Hej, wszyscy: proszę, nie kopiuj bezmyślnie i wklej wszystkie nagłówki, które możesz znaleźć)
Po pierwsze, Historia przycisku Wstecz jest a nie cache:
Model świeżości (sekcja 4.2) niekoniecznie ma zastosowanie do mechanizmów historycznych. Oznacza to, że mechanizm historii może wyświetlić poprzednią reprezentację, nawet jeśli wygasła.
W STAREJ specyfikacji HTTP sformułowanie było jeszcze silniejsze, wyraźnie nakazując przeglądarkom lekceważenie pamięci podręcznej dyrektywy dla historii przycisków Wstecz.
Back ma się cofnąć w czasie (do czasu, kiedy użytkownik był zalogowany). Nie przekierowuje do wcześniej otwartego adresu URL.
Jednak w praktyce cache może wpływać na przycisk Wstecz, w bardzo specyficznych okolicznościach:]}- Strona musi być dostarczona przez HTTPS , W przeciwnym razie to pękanie pamięci podręcznej nie będzie wiarygodne. Ponadto, jeśli nie używasz HTTPS, Twoja strona jest podatna na kradzież logowania na wiele innych sposobów.
- musisz wysłać
Cache-Control: no-store, must-revalidate
(niektóre przeglądarki obserwująno-store
, a niektóre obserwująmust-revalidate
)
You never need any of:
-
<meta>
z nagłówkami pamięci podręcznej - w ogóle nie działa. Całkowicie bezużyteczny. -
post-check
/pre-check
- jest to dyrektywa tylko dla IE, która ma zastosowanie tylko do zasobów cachable. - wysyłanie tego samego nagłówka dwa lub kilkanaście części. Niektóre fragmenty PHP faktycznie zastępują poprzednie nagłówki, co powoduje wysłano tylko ostatniego.
Jeśli chcesz, możesz dodać:
-
no-cache
lubmax-age=0
, które sprawią, że zasób (URL) będzie" przestarzały " i wymagać od przeglądarek sprawdzenia z serwerem, czy istnieje nowsza wersja (no-store
implikuje to jeszcze silniej). - {[9] } z datą w przeszłości dla klientów HTTP/1.0 (chociaż prawdziwe HTTP / 1.0-tylko klienci nie istnieją w dzisiejszych czasach).
Bonus: nowy RFC buforowania HTTP .
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
2016-07-19 12:24:36
Jak stwierdził @ Kornel, nie chcesz dezaktywować pamięci podręcznej, ale dezaktywować bufor historii. Różne przeglądarki mają swoje własne subtelne sposoby wyłączenia bufora historii.
W Chrome (v28.0.1500.95 m) możemy to zrobić tylko przez Cache-Control: no-store
.
Cache-Control: no-store
-
Cache-Control: no-cache
(tylko https) -
Pragma: no-cache
(tylko https) -
Vary: *
(https tylko)
W Operze (v12.15) możemy to zrobić tylko przez Cache-Control: must-revalidate
(tylko https).
-
Cache-Control: no-store
<body onunload="">
w html -
Cache-Control: no-store
(tylko https)
W IE8 (v8.0.6001.18702 IC) każdy z nich będzie praca:
Cache-Control: must-revalidate, max-age=0
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: must-revalidate
Expires: 0
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
-
Pragma: no-cache
(tylko https) -
Vary: *
(tylko https)
Połączenie powyższego daje nam to rozwiązanie, które działa dla Chrome 28, FireFox 23, IE8, Safari 5.1.7 i Opera 12.15: Cache-Control: no-store, must-revalidate
(https tylko)
Zauważ, że https jest potrzebny, ponieważ Opera nie dezaktywuje bufora historii dla zwykłych stron http. Jeśli naprawdę nie możesz uzyskać https i jesteś gotowy zignorować operę, najlepsze co możesz zrobić to:
Cache-Control: no-store
<body onunload="">
Poniżej pokazuje surowe logi moich testów:
HTTP:
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Fail: Opera 12.15
sukces: Chrome 28, FireFox 23, IE8, Safari 5.1.7-
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
Fail: Opera 12.15
sukces: Chrome 28, FireFox 23, IE8, Safari 5.1.7 -
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
Fail: Safari 5.1.7, Opera 12.15
sukces: Chrome 28, FireFox 23, IE8 -
Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Fail: Safari 5.1.7, Opera 12.15
sukces: Chrome 28, FireFox 23, IE8 -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
sukces: IE8 -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sukcesy: IE8 -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
sukces: IE8 -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
sukces: IE8 -
Cache-Control: no-store
Fail: Safari 5.1.7, Opera 12.15
Sukces: Chrome 28, FireFox 23, IE8 -
Cache-Control: no-store
<body onunload="">
Fail: Opera 12.15
sukces: Chrome 28, FireFox 23, IE8, Safari 5.1.7 -
Cache-Control: no-cache
Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
sukces: IE8 -
Vary: *
Fail: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
sukces: brak -
Pragma: no-cache
Fail: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
sukces: brak -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
sukces: IE8 -
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
sukces: IE8 -
Cache-Control: must-revalidate, max-age=0
Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
sukces: IE8 -
Cache-Control: must-revalidate
Expires: 0
Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
sukces: IE8 -
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
sukces: IE8 -
Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
Pragma: no-cache
Vary: *
<body onunload="">
Fail: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
sukces: brak
HTTPS:
-
Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
<body onunload="">
Fail: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
sukces: brak -
Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
<body onunload="">
Fail: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
sukces: brak -
Vary: *
Fail: Chrome 28, Safari 5.1.7, Opera 12.15
sukces: FireFox 23, IE8 -
Pragma: no-cache
Fail: Chrome 28, Safari 5.1.7, Opera 12.15
sukces: FireFox 23, IE8 -
Cache-Control: no-cache
Fail: Chrome 28, Safari 5.1.7, Opera 12.15
sukces: FireFox 23, IE8 -
Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Fail: Chrome 28, Safari 5.1.7, Opera 12.15
Sukces: FireFox 23, IE8 -
Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
Fail: Chrome 28, Safari 5.1.7, Opera 12.15
sukces: FireFox 23, IE8 -
Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Fail: Chrome 28, Safari 5.1.7, Opera 12.15
sukces: FireFox 23, IE8 Cache-Control: must-revalidate
Fail: Chrome 28, FireFox 23, IE8, Safari 5.1.7
sukces: Opera 12.15-
Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
<body onunload="">
Fail: Chrome 28, FireFox 23, IE8, Safari 5.1.7
sukces: Opera 12.15 -
Cache-Control: must-revalidate, max-age=0
Fail: Chrome 28, FireFox 23, Safari 5.1.7
sukces: IE8, Opera 12.15 Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
Fail: Chrome 28, Safari 5.1.7
sukces: FireFox 23, IE8, Opera 12.15-
Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Fail: Chrome 28, Safari 5.1.7
sukces: FireFox 23, IE8, Opera 12.15 -
Cache-Control: no-store
Fail: Opera 12.15
sukces: Chrome 28, FireFox 23, IE8, Safari 5.1.7 Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
Pragma: no-cache
Vary: *
<body onunload="">
Fail: Opera 12.15
sukces: Chrome 28, FireFox 23, IE8, Safari 5.1.7-
Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
<body onunload="">
Fail: Opera 12.15
sukces: Chrome 28, FireFox 23, IE8, Safari 5.1.7 -
Cache-Control: private, no-cache
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Fail: Chrome 28, Safari 5.1.7, Opera 12.15
sukces: FireFox 23, IE8 -
Cache-Control: must-revalidate
Expires: 0
Fail: Chrome 28, FireFox 23, Safari 5.1.7,
sukces: IE8, Opera 12.15 -
Cache-Control: must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Fail: Chrome 28, FireFox 23, Safari 5.1.7,
sukces: IE8, Opera 12.15 -
Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: 0
<body onunload="">
Fail: Chrome 28, FireFox 23, Safari 5.1.7,
sukces: IE8, Opera 12.15 Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Expires: Sat, 12 Oct 1991 05:00:00 GMT
<body onunload="">
Fail: Chrome 28, FireFox 23, Safari 5.1.7,
sukces: IE8, Opera 12.15-
Cache-Control: private, must-revalidate
Expires: Sat, 12 Oct 1991 05:00:00 GMT
Pragma: no-cache
Vary: *
Fail: Chrome 28, Safari 5.1.7
sukces: FireFox 23, IE8, Opera 12.15 -
Cache-Control: no-store, must-revalidate
Fail: brak
sukces: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
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
2020-03-11 15:08:14
Znalazłem sieć.config route useful (próbowałem dodać go do odpowiedzi, ale wydaje się, że nie został zaakceptowany, więc publikowanie tutaj)
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Cache-Control" value="no-cache, no-store, must-revalidate" />
<!-- HTTP 1.1. -->
<add name="Pragma" value="no-cache" />
<!-- HTTP 1.0. -->
<add name="Expires" value="0" />
<!-- Proxies. -->
</customHeaders>
</httpProtocol>
</system.webServer>
A oto express / node.js sposób na to samo:
app.use(function(req, res, next) {
res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
res.setHeader('Pragma', 'no-cache');
res.setHeader('Expires', '0');
next();
});
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
2016-11-23 12:21:46
Okazało się, że wszystkie odpowiedzi na tej stronie nadal mają problemy. W szczególności zauważyłem, że żaden z nich nie powstrzyma IE8 przed używaniem buforowanej wersji strony, gdy uzyskasz do niej dostęp, naciskając przycisk Wstecz.
Po wielu badaniach i testach odkryłem, że jedyne dwa nagłówki, których naprawdę potrzebowałem, to:
Cache-Control: no-store
Vary: *
Aby uzyskać wyjaśnienie nagłówka Vary, sprawdź http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6
W IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4 i Opera 9-10 nagłówki te powodowały, że strona była żądana z serwera po kliknięciu łącza do strony lub umieszczeniu adresu URL bezpośrednio w pasku adresu. Która obejmuje około 99% wszystkich przeglądarek w użyciu od stycznia ' 10.
W IE6 i operze 9-10 naciśnięcie przycisku Wstecz nadal powodowało załadowanie wersji buforowanej. Na wszystkich innych przeglądarkach I Przetestowane, pobrali świeżą wersję z serwera. Do tej pory nie znalazłem żadnego zestawu nagłówków, które spowodują, że te przeglądarki nie zwracają buforowanych wersji stron po naciśnięciu przycisku Wstecz.
Update: Po napisaniu tej odpowiedzi zdałem sobie sprawę, że nasz serwer WWW identyfikuje się jako serwer HTTP 1.0. Nagłówki, które wymieniłem, są poprawne, aby odpowiedzi z serwera HTTP 1.0 nie były buforowane przez przeglądarki. Dla serwera HTTP 1.1, spójrz na Odpowiedź balusca .
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-05-23 10:31:39
Po odrobinie badań wymyśliliśmy następującą listę nagłówków, które wydawały się pokrywać większość przeglądarek:
- wygasa : Mon, 26 Jul 1997 05: 00: 00 GMT
- Cache-Control: no-cache , private, must-revalidate , max-stale=0, post-check=0, pre-check=0 no-store
- Pragma : no-cache
W ASP.NET dodaliśmy je za pomocą następującego fragmentu:
Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0
Znalezione z: http://forums.asp.net/t/1013531.aspx
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
2008-09-08 13:55:28
Użycie nagłówka pragma w odpowiedzi jest bajką. RFC2616 definiuje go tylko jako nagłówek żądania
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
2008-09-17 14:18:00
Zastrzeżenie: zdecydowanie sugeruję przeczytanie odpowiedzi @BalusC. Po przeczytaniu poniższego samouczka buforowania: http://www.mnot.net/cache_docs / (polecam też przeczytać), uważam, że jest poprawny. Jednak ze względów historycznych (i dlatego, że sam przetestowałem), dołączę moją oryginalną odpowiedź poniżej: {]}
Próbowałem 'akceptowane' odpowiedź dla PHP, które nie działa dla mnie. Potem trochę poszperałem, znalazłem lekki wariant, Przetestowałem go i zadziałało. Proszę. jest:
header('Cache-Control: no-store, private, no-cache, must-revalidate'); // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false); // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Expires: 0', false);
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header ('Pragma: no-cache');
To powinno zadziałać. Problem polegał na tym, że przy dwukrotnym ustawieniu tej samej części nagłówka, jeśli false
nie zostanie wysłana jako drugi argument do funkcji nagłówka, funkcja nagłówka po prostu nadpisze poprzednie wywołanie header()
. Tak więc, podczas ustawiania Cache-Control
, na przykład, jeśli ktoś nie chce umieścić wszystkich argumentów w jednym wywołaniu funkcji header()
, musi zrobić coś takiego:
header('Cache-Control: this');
header('Cache-Control: and, this', false);
Zobacz więcej kompletnej dokumentacji tutaj .
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
2010-01-25 16:15:29
Dla ASP.NET Core, create a simple middleware class:
public class NoCacheMiddleware
{
private readonly RequestDelegate m_next;
public NoCacheMiddleware( RequestDelegate next )
{
m_next = next;
}
public async Task Invoke( HttpContext httpContext )
{
httpContext.Response.OnStarting( ( state ) =>
{
// ref: http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers
httpContext.Response.Headers.Append( "Cache-Control", "no-cache, no-store, must-revalidate" );
httpContext.Response.Headers.Append( "Pragma", "no-cache" );
httpContext.Response.Headers.Append( "Expires", "0" );
return Task.FromResult( 0 );
}, null );
await m_next.Invoke( httpContext );
}
}
Następnie zarejestruj go za pomocą Startup.cs
app.UseMiddleware<NoCacheMiddleware>();
Upewnij się, że dodasz to gdzieś po
app.UseStaticFiles();
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
2016-05-19 20:09:11
Dyrektywy te nie zmniejszają żadnego zagrożenia bezpieczeństwa. Mają one na celu zmuszenie UA do odświeżania ulotnych informacji, a nie powstrzymywanie UA przed zatrzymywaniem informacji. Zobacz to podobne pytanie . Przynajmniej nie ma gwarancji, że żadne routery, proxy itp. nie zignoruje również dyrektyw buforowania.
Bardziej pozytywna Uwaga, zasady dotyczące fizycznego dostępu do komputerów, instalacji oprogramowania i tym podobne sprawią, że wyprzedzisz większość firm pod względem bezpieczeństwa. Jeśli konsumenci tych informacji są członkami społeczeństwa, jedyną rzeczą, którą możesz naprawdę zrobić, to pomóc im zrozumieć, że gdy informacja trafi do ich maszyny, Ta maszyna jest ich odpowiedzialnością, nie Twoją.
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-05-23 12:02:57
Jest błąd w IE6
Zawartość z "Content-Encoding: gzip" jest zawsze buforowana, nawet jeśli używasz "Cache-Control: no-cache".
Http://support.microsoft.com/kb/321722
Możesz wyłączyć kompresję gzip dla użytkowników IE6 (sprawdź user agent dla "MSIE 6")
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
2013-07-01 10:20:47
RFC dla HTTP 1.1 mówi, że właściwą metodą jest dodanie nagłówka HTTP dla:
Cache-Control: no-cache
Starsze przeglądarki mogą to zignorować, jeśli nie są prawidłowo zgodne z HTTP 1.1. Dla tych możesz wypróbować nagłówek:
Pragma: no-cache
To ma również działać dla przeglądarek HTTP 1.1.
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
2008-09-08 12:14:57
Ustawienie zmodyfikowanego nagłówka http na jakąś datę w 1995 r. Zwykle załatwia sprawę.
Oto przykład:
Expires: Wed, 15 Nov 1995 04:58:08 GMT Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT Cache-Control: no-cache, must-revalidate
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
2008-11-19 08:23:21
Dokumentacja PHP dla funkcji nagłówka ma dość kompletny przykład (napisany przez stronę trzecią):
header('Pragma: public');
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate'); // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0', false); // HTTP/1.1
header ("Pragma: no-cache");
header("Expires: 0", false);
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
2012-04-13 18:27:44
Jeśli masz problemy z pobieraniem IE6-IE8 przez SSL i cache: no-cache header (i podobne wartości) z plikami MS Office możesz użyć cache:private,no-store header I return file na żądanie POST. To działa.
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
2012-09-21 09:02:33
W moim przypadku naprawiam problem w chrome za pomocą tego
<form id="form1" runat="server" autocomplete="off">
Gdzie muszę wyczyścić zawartość formularza previus, gdy użytkownicy klikną przycisk Wstecz ze względów bezpieczeństwa
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
2013-06-19 17:28:58
Przyjęta odpowiedź nie wydaje się działać dla IIS7+, idąc przez dużą liczbę pytań o nagłówki pamięci podręcznej nie są wysyłane w II7:
- coś zmusza odpowiedzi do posiadania Cache-control: private in IIS7
- IIS7: nie działa ustawienie pamięci podręcznej... dlaczego?
- IIS7 + ASP.NET nie działa nagłówek buforowania klienta MVC
- Set cache-control for aspx pages
- Cache-control: no-store, must-revalidate not wysłane do przeglądarki klienta w IIS7 + ASP.NET MVC
I tak dalej
Przyjęta odpowiedź jest prawidłowa, w których nagłówkach należy ustawić, ale nie w jaki sposób mają być ustawione. W ten sposób działa z IIS7:
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "-1");
Pierwsza linia ustawia Cache-control
na no-cache
, a druga dodaje Pozostałe atrybuty no-store, must-revalidate
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-05-23 12:10:45
Miałem najlepsze i najbardziej spójne wyniki we wszystkich przeglądarkach, ustawiając Pragma: no-cache
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
2008-09-17 12:32:53
Nagłówki w odpowiedzi udzielonej przez BalusC nie uniemożliwiają przeglądarce Safari 5 (i ewentualnie także starszym wersjom) wyświetlania zawartości z pamięci podręcznej przeglądarki podczas korzystania z przycisku Wstecz. Aby temu zapobiec, należy dodać pusty atrybut obsługi zdarzenia onunload do tagu body:
<body onunload="">
Ten hack najwyraźniej łamie pamięć podręczną back-forward W Safari: czy istnieje Zdarzenie cross-browser onload po kliknięciu przycisku back?
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-05-23 10:31:39
Również, na wszelki wypadek, upewnij się, że zresetowałeś ExpiresDefault
w pliku .htaccess
, Jeśli używasz go do włączania buforowania.
ExpiresDefault "access plus 0 seconds"
Następnie możesz użyć ExpiresByType
, Aby ustawić określone wartości dla plików, które chcesz buforować:
ExpiresByType image/x-icon "access plus 3 month"
Może się to również przydać, jeśli Twoje dynamiczne pliki, np. php, itp. są buforowane przez przeglądarkę i nie możesz dowiedzieć się, dlaczego. Sprawdź ExpiresDefault
.
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
2016-08-19 20:47:34
Oprócz nagłówków rozważ obsługę swojej strony za pośrednictwem https. Wiele przeglądarek domyślnie nie buforuje https.
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
2008-11-19 08:31:33
//In .net MVC
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult FareListInfo(long id)
{
}
// In .net webform
<%@ OutputCache NoStore="true" Duration="0" VaryByParam="*" %>
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
2013-02-06 08:52:53
Do uzupełnienia BalusC -> odpowiedź Jeśli używasz Perla, możesz użyć CGI do dodania nagłówków HTTP.
Używanie Perla:
Use CGI;
sub set_new_query() {
binmode STDOUT, ":utf8";
die if defined $query;
$query = CGI->new();
print $query->header(
-expires => 'Sat, 26 Jul 1997 05:00:00 GMT',
-Pragma => 'no-cache',
-Cache_Control => join(', ', qw(
private
no-cache
no-store
must-revalidate
max-age=0
pre-check=0
post-check=0
))
);
}
Używając apache httpd.conf
<FilesMatch "\.(html|htm|js|css|pl)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>
Uwaga: kiedy próbowałem użyć meta html, przeglądarki ignorowały je i buforowały stronę.
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-05-23 11:47:32
Chcę tylko zaznaczyć, że jeśli ktoś chce zapobiec buforowaniu tylko treści dynamicznych, dodawanie tych dodatkowych nagłówków powinno być dokonywane programowo.
Edytowałem plik konfiguracyjny mojego projektu, aby dodać nagłówki bez pamięci podręcznej, ale to również wyłączyło buforowanie statycznej zawartości, co zwykle nie jest pożądane. Modyfikowanie nagłówków odpowiedzi w kodzie zapewnia, że obrazy i pliki stylów będą buforowane.
Jest to dość oczywiste, ale wciąż warte wspomnienia.I inne Uwaga. Bądź ostrożny używając metody ClearHeaders z klasy HttpResponse. Może dać ci siniaki, jeśli używasz go lekkomyślnie. Tak jak mnie.
Po przekierowaniu na zdarzenie ActionFilterAttribute następstwem wyczyszczenia wszystkich nagłówków jest utrata wszystkich danych sesji i danych z magazynu TempData. Bezpieczniej jest przekierować z akcji lub nie wyczyścić nagłówków, gdy odbywa się przekierowanie.
Po namyśle odradzam wszystkim stosowanie metody ClearHeaders. Lepiej usunąć nagłówki oddzielnie. Aby poprawnie ustawić nagłówek Cache-Control używam tego kodu:filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");
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
2014-05-22 13:09:35
Nie miałem szczęścia z elementami. Dodawanie parametrów związanych z pamięcią podręczną HTTP bezpośrednio (poza dokumentem HTML) rzeczywiście działa dla mnie.
Przykładowy kod w Pythonie za pomocą web.py web.header
wywołania następują. Celowo zredagowałem swój osobisty, nieistotny kod użytkowy.
import web import sys import PERSONAL-UTILITIES myname = "main.py" urls = ( '/', 'main_class' ) main = web.application(urls, globals()) render = web.template.render("templates/", base="layout", cache=False) class main_class(object): def GET(self): web.header("Cache-control","no-cache, no-store, must-revalidate") web.header("Pragma", "no-cache") web.header("Expires", "0") return render.main_form() def POST(self): msg = "POSTed:" form = web.input(function = None) web.header("Cache-control","no-cache, no-store, must-revalidate") web.header("Pragma", "no-cache") web.header("Expires", "0") return render.index_laid_out(greeting = msg + form.function) if __name__ == "__main__": nargs = len(sys.argv) # Ensure that there are enough arguments after python program name if nargs != 2: LOG-AND-DIE("%s: Command line error, nargs=%s, should be 2", myname, nargs) # Make sure that the TCP port number is numeric try: tcp_port = int(sys.argv[1]) except Exception as e: LOG-AND-DIE ("%s: tcp_port = int(%s) failed (not an integer)", myname, sys.argv[1]) # All is well! JUST-LOG("%s: Running on port %d", myname, tcp_port) web.httpserver.runsimple(main.wsgifunc(), ("localhost", tcp_port)) main.run()
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
2016-08-10 22:56:25
Zobacz ten link do studium przypadku na temat buforowania:
Http://securityevaluators.com/knowledge/case_studies/caching/
Podsumowanie, zgodnie z artykułem, tylko Cache-Control: no-store
działa na Chrome, Firefox i IE. IE akceptuje inne kontrolki, ale Chrome i Firefox nie. Link jest dobrą lekturą wraz z historią buforowania i dokumentowania proof of concept.
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
2018-04-22 17:46:50
Rozwiązałem to w ten sposób.
2 rozważania:
1) zdarzenia po stronie serwera nie są wywoływane przy back click, zamiast javascript.
2) mam 2 javascript do odczytu / zapisu plików cookies
function setCookie(name, value, days)
{
var expires = "";
if (days)
{
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + (value || "") + expires + "; path=/";
}
function getCookie(name)
{
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = ca.length - 1; i >= 0; i--)
{
var c = ca[i];
while (c.charAt(0) == ' ')
{
c = c.substring(1, c.length);
}
if (c.indexOf(nameEQ) == 0)
{
return c.substring(nameEQ.length, c.length);
}
}
return null;
}
W moim Page_Load wstawiłem to: (to nie jest odpalane po kliknięciu wstecz)
protected void Page_Load(object sender, EventArgs e)
{
Page.RegisterClientScriptBlock("", "<script>setCookie('" + Session.SessionID + "', '" + Login + "', '100');</script>");
}
Gdzie 'Login' to wartość mojego id, która wynosi -1 po wylogowaniu(możesz użyć czegoś innego, na przykład logicznego).
Potem na swojej stronie dodałem to: (to jest odpalane z powrotem kliknij)
<script type="text/javascript">
if (getCookie('<%= Session.SessionID %>') < 0)
{
if (history.length > 0)
{
history.go(+1);
}
}
</script>
Nic więcej.
W tym rozwiązaniu kliknij Wstecz Włącz na każdej stronie i Wyłącz Tylko po wylogowaniu na każdej stronie w tej samej przeglądarce.
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
2020-06-12 08:58:08
Możesz użyć bloku lokalizacji dla ustawionego pojedynczego pliku zamiast całego buforowania aplikacji w IIS
<location path="index.html">
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Cache-Control" value="no-cache" />
</customHeaders>
</httpProtocol>
</system.webServer>
</location>
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
2020-05-12 05:30:03
Nie jestem pewien, czy moja odpowiedź brzmi prosto i głupio, i być może była już znana od dawna, ale ponieważ uniemożliwienie komuś korzystania z przycisku Wstecz przeglądarki do przeglądania historycznych stron jest jednym z twoich celów, możesz użyć:
window.location.replace("https://www.example.com/page-not-to-be-viewed-in-browser-history-back-button.html");
Oczywiście może to nie być możliwe do zaimplementowania w całej witrynie, ale przynajmniej w przypadku niektórych krytycznych stron możesz to zrobić. Mam nadzieję, że to pomoże.
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
2020-05-29 12:29:10