Nasze badania wykazały, że nie wszystkie przeglądarki przestrzegają dyrektyw bufora HTTP w jednolity sposób.
Ze względów bezpieczeństwa nie chcemy niektóre strony w naszej aplikacji do pamięci podręcznej, kiedykolwiek, przez przeglądarkę internetową. Musi to działać w co najmniej następujących przeglądarkach:
- Internet Explorer 6+
- Firefox 1.5+
- Safari 3+
- Opera 9+
- Chrom
Nasze wymagania wynikają z testu bezpieczeństwa. Po wylogowaniu z naszej strony internetowej możesz nacisnąć przycisk Wstecz i przeglądać buforowane strony.
http
caching
https
http-headers
Edward Wilde
źródło
źródło
Odpowiedzi:
Wprowadzenie
Prawidłowy minimalny zestaw nagłówków, który działa na wszystkich wymienionych klientach (i serwerach proxy):
Jest
Cache-Control
to zgodne ze specyfikacją HTTP 1.1 dla klientów i serwerów proxy (i domyślnie wymagane przez niektórych klientów obokExpires
). JestPragma
to zgodne ze specyfikacją HTTP 1.0 dla klientów prehistorycznych. TheExpires
to zgodne ze specyfikacjami HTTP 1.0 i 1.1 dla klientów i serwerów proxy. W HTTP 1.1Cache-Control
ma pierwszeństwo przedExpires
, więc w końcu dotyczy tylko serwerów proxy HTTP 1.0.Jeśli nie obchodzi Cię IE6 i jego zepsute buforowanie, gdy wyświetlasz strony tylko przez HTTPS
no-store
udostępniania , możesz to pominąćCache-Control: no-cache
.Jeśli nie przejmujesz się klientami IE6 ani HTTP 1.0 (HTTP 1.1 został wprowadzony w 1997 r.), Możesz to pominąć
Pragma
.Jeśli nie obchodzą Cię również proxy HTTP 1.0, możesz to pominąć
Expires
.Z drugiej strony, jeśli serwer automatycznie zawiera poprawny
Date
nagłówek, to teoretycznie możesz też pominąćCache-Control
i polegać naExpires
tylko na.Ale może się to nie powieść, jeśli np. Użytkownik końcowy manipuluje datą systemu operacyjnego, a oprogramowanie klienckie na niej polega.
Inne
Cache-Control
parametry, takie jakmax-age
nieistotne, jeśliCache-Control
zostaną określone wyżej wymienione parametry.Last-Modified
Nagłówek jak zawarte w większości innych odpowiedzi tutaj jest tylko interesujące, jeśli rzeczywiście chcemy buforować żądanie, dzięki czemu nie trzeba określić go wcale.Jak to ustawić?
Za pomocą PHP:
Za pomocą Java Servlet lub Node.js:
Korzystanie z ASP.NET-MVC
Za pomocą interfejsu API sieci Web ASP.NET:
Za pomocą ASP.NET:
Korzystanie z ASP.NET Core v3
Korzystanie z ASP:
Korzystanie z Ruby on Rails lub Python / Flask:
Za pomocą Python / Django:
Za pomocą Python / Pyramid:
Za pomocą Go:
Za pomocą
.htaccess
pliku Apache :Za pomocą HTML4:
Metatagi HTML a 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 zarówno w nagłówkach odpowiedzi HTTP, jak i
<meta http-equiv>
znacznikach HTML , wówczas określony w nagłówku odpowiedzi HTTP uzyska pierwszeństwo przed metatagiem HTML. Metatag HTML zostanie użyty tylko wtedy, gdy strona zostanie wyświetlona z lokalnego systemu plików dysku za pośrednictwemfile://
adresu URL. Zobacz także rozdział 5.2.2 specyfikacji HTML W3 . Zachowaj ostrożność, gdy nie określisz ich programowo, ponieważ serwer WWW może mianowicie zawierać pewne wartości domyślne.Ogólnie rzecz biorąc, lepiej nie podawać metatagów HTML, aby uniknąć pomyłek przez osoby rozpoczynające i polegać na twardych nagłówkach odpowiedzi HTTP. Co więcej, w szczególności te
<meta http-equiv>
tagi są nieprawidłowe w HTML5. Tylkohttp-equiv
wartości wymienione w specyfikacji HTML5 .Weryfikacja rzeczywistych nagłówków odpowiedzi HTTP
Aby zweryfikować jedno i drugie, można je zobaczyć / debugować w monitorze ruchu HTTP zestawu narzędzi programistycznych przeglądarki internetowej. Możesz się tam dostać, naciskając klawisz F12 w przeglądarce Chrome / Firefox23 + / IE9 +, a następnie otwierając panel karty „Sieć” lub „Sieć”, a następnie klikając interesujące żądanie HTTP, aby wyświetlić wszystkie szczegóły dotyczące żądania i odpowiedzi HTTP. Poniżej zrzut ekranu jest z Chrome:
Chcę również ustawić te nagłówki w plikach do pobrania
Przede wszystkim to pytanie i odpowiedź są skierowane na „strony internetowe” (strony HTML), a nie „pliki do pobrania” (PDF, zip, Excel itp.). Lepiej je buforuj i użyj jakiegoś identyfikatora wersji pliku gdzieś na ścieżce URI lub w zapytaniu, aby wymusić ponowne pobranie zmienionego pliku. Przy stosowaniu tych nagłówków no-cache przy pobieraniu plików, uważaj na błąd IE7 / 8, gdy podajesz pobieranie pliku przez HTTPS zamiast HTTP. Aby uzyskać szczegółowe informacje, zobacz IE nie może pobrać foo.jsf. IE nie mógł otworzyć tej strony internetowej. Żądana witryna jest niedostępna lub nie można jej znaleźć .
źródło
(hej, wszyscy: proszę nie tylko bezmyślnie kopiuj i wklejaj wszystkie nagłówki, które możesz znaleźć)
Po pierwsze, historia przycisku Wstecz nie jest pamięcią podręczną :
W starej specyfikacji HTTP sformułowanie było jeszcze mocniejsze, wyraźnie mówiąc przeglądarkom, aby ignorowały dyrektywy pamięci podręcznej dotyczące historii przycisków wstecz.
Cofnij ma cofnąć się w czasie (do czasu, kiedy użytkownik był) zalogowany). Nie przechodzi do poprzednio otwartego adresu URL.
Jednak w praktyce pamięć podręczna może wpływać na przycisk Wstecz w bardzo szczególnych okolicznościach:
Cache-Control: no-store, must-revalidate
(niektóre przeglądarki obserwują,no-store
a niektóre obserwująmust-revalidate
)Nigdy nie potrzebujesz żadnego z:
<meta>
z nagłówkami pamięci podręcznej - to w ogóle nie działa. Zupełnie bezużyteczne.post-check
/pre-check
- to dyrektywa tylko dla IE, która ma zastosowanie tylko do zasobów buforowanych .Jeśli chcesz, możesz dodać:
no-cache
lubmax-age=0
, co sprawi, że zasób (URL) stanie się „nieaktualny” i będzie wymagał od przeglądarek sprawdzenia na serwerze, czy jest dostępna nowsza wersja (no-store
już implikuje to jeszcze silniejsze).Expires
z datą w przeszłości dla klientów HTTP / 1.0 (chociaż w rzeczywistości nie ma obecnie prawdziwych klientów obsługujących tylko HTTP / 1.0).Bonus: nowy RFC buforujący HTTP .
źródło
Cache-Control: must-revalidate
. Dlaczego nie wysłać,Cache-Control: no-cache
skorono-cache
już to sugerujemust-revalidate
? w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1no-cache
zmust-revalidate
jest prawdziwy dla pamięci podręcznej, ale historia wsteczna nie jest pamięcią podręczną. Przeglądarki, w szczególności jawne,must-revalidate
do kontrolowania zachowania historii .Jak stwierdził @Kornel, nie chcesz dezaktywować pamięci podręcznej, ale dezaktywować bufor historii. Różne przeglądarki mają swoje subtelne sposoby wyłączania bufora historii.
W Chrome (v28.0.1500.95 m) możemy to zrobić tylko przez
Cache-Control: no-store
.W FireFox (v23.0.1) każdy z nich będzie działał:
Cache-Control: no-store
Cache-Control: no-cache
(tylko https)Pragma: no-cache
(tylko https)Vary: *
(tylko https)W Operze (v12.15) możemy to zrobić
Cache-Control: must-revalidate
tylko (tylko https).W przeglądarce Safari (wersja 5.1.7, 7534.57.2) dowolny z nich będzie działał:
Cache-Control: no-store
<body onunload="">
w htmlCache-Control: no-store
(tylko https)W IE8 (v8.0.6001.18702IC) każdy z nich będzie działał:
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 w Chrome 28, FireFox 23, IE8, Safari 5.1.7 i Opera 12.15:
Cache-Control: no-store, must-revalidate
(tylko https)Pamiętaj, że https jest potrzebne, 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:
Poniżej przedstawiono surowe dzienniki 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="">
Niepowodzenie: 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="">
Niepowodzenie: 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: *
Niepowodzenie: 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: *
Niepowodzenie: 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="">
Niepowodzenie: 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="">
Niepowodzenie: 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="">
Niepowodzenie: 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="">
Niepowodzenie: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sukces: IE8
Cache-Control: no-store
Niepowodzenie: Safari 5.1.7, Opera 12.15
Sukces: Chrome 28, FireFox 23, IE8
Cache-Control: no-store
<body onunload="">
Niepowodzenie: Opera 12.15
Sukces: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Cache-Control: no-cache
Niepowodzenie: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sukces: IE8
Vary: *
Niepowodzenie: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Sukces: brak
Pragma: no-cache
Niepowodzenie: 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="">
Niepowodzenie: 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="">
Niepowodzenie: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sukces: IE8
Cache-Control: must-revalidate, max-age=0
Niepowodzenie: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
Sukces: IE8
Cache-Control: must-revalidate
Expires: 0
Niepowodzenie: 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
Niepowodzenie: 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="">
Niepowodzenie: 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="">
Niepowodzenie: 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="">
Niepowodzenie: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
Sukces: brak
Vary: *
Niepowodzenie: Chrome 28, Safari 5.1.7, Opera 12.15
Sukces: FireFox 23, IE8
Pragma: no-cache
Niepowodzenie: Chrome 28, Safari 5.1.7, Opera 12.15
Sukces: FireFox 23, IE8
Cache-Control: no-cache
Niepowodzenie: 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
Niepowodzenie: 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: *
Niepowodzenie: 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: *
Niepowodzenie: Chrome 28, Safari 5.1.7, Opera 12.15
Sukces: FireFox 23, IE8
Cache-Control: must-revalidate
Niepowodzenie: 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="">
Niepowodzenie: Chrome 28, FireFox 23, IE8, Safari 5.1.7
Sukces: Opera 12.15
Cache-Control: must-revalidate, max-age=0
Niepowodzenie: 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="">
Niepowodzenie: 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="">
Niepowodzenie: Chrome 28, Safari 5.1.7
Sukces: FireFox 23, IE8, Opera 12.15
Cache-Control: no-store
Niepowodzenie: 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="">
Niepowodzenie: 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="">
Niepowodzenie: 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: *
Niepowodzenie: Chrome 28, Safari 5.1.7, Opera 12.15
Sukces: FireFox 23, IE8
Cache-Control: must-revalidate
Expires: 0
Niepowodzenie: 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
Niepowodzenie: 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="">
Niepowodzenie: 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="">
Niepowodzenie: 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: *
Niepowodzenie: Chrome 28, Safari 5.1.7
Sukces: FireFox 23, IE8, Opera 12.15
Cache-Control: no-store, must-revalidate
Niepowodzenie: brak
Sukces: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
źródło
<body onunload="">
ale wydaje się, że jest to sposób na obejście faktycznego problemu. Próbowałem użyć .htaccess i zmodyfikować w ten sposób nagłówki, czy jeśli korzystam z HTTPS, czy powinien on działać w ten sposób? Problem dotyczy głównie safari.Cache-Control: no-store
.<body onunload="">
jest potrzebny tylko wtedy, gdy nie masz HTTPS.Uznałem, że trasa web.config jest przydatna (próbowałem dodać ją do odpowiedzi, ale wydaje się, że nie została zaakceptowana, więc opublikuj tutaj)
A oto sposób, w jaki express / node.js robi to samo:
źródło
web.conf
jest: Jest to główny plik ustawień i konfiguracjiASP.NET
aplikacji internetowej. Jest to dokument XML znajdujący się w katalogu głównym. ( wiki ).Odkryłem, że wszystkie odpowiedzi na tej stronie wciąż miały problemy. W szczególności zauważyłem, że żaden z nich nie powstrzyma IE8 przed użyciem wersji strony z pamięci podręcznej, 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:
Wyjaśnienie nagłówka Vary można znaleźć na stronie http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6
W przypadku IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4 i Opera 9-10 nagłówki te spowodowały żądanie strony z serwera po kliknięciu łącza do strony lub umieszczeniu adresu URL bezpośrednio w pasku adresu. To obejmuje około 99% wszystkich używanych przeglądarek od stycznia '10.
W IE6 i Opera 9-10 naciśnięcie przycisku Wstecz nadal powodowało załadowanie wersji buforowanej. We wszystkich testowanych przeze mnie przeglądarkach pobierały nową wersję z serwera. Do tej pory nie znalazłem żadnego zestawu nagłówków, który spowodowałby, że przeglądarki nie zwrócą buforowanych wersji stron po naciśnięciu przycisku Wstecz.
Aktualizacja: Po napisaniu tej odpowiedzi zdałem sobie sprawę, że nasz serwer sieciowy 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. W przypadku serwera HTTP 1.1 spójrz na odpowiedź BalusC .
źródło
Po krótkich badaniach opracowaliśmy następującą listę nagłówków, które zdawały się obejmować większość przeglądarek:
W ASP.NET dodaliśmy je za pomocą następującego fragmentu:
Znalezione z: http://forums.asp.net/t/1013531.aspx
źródło
Cache-Control: no-cache
iCache-Control: private
kolizja - nigdy nie powinieneś zbierać razem: pierwsza mówi przeglądarkom i serwerom proxy, aby w ogóle nie buforować, druga informuje proxy, aby nie buforować, ale pozwala przeglądarkom przechowywać ich prywatną kopię. Nie jestem pewien, które ustawienie zostanie zastosowane w przeglądarce, ale jest mało prawdopodobne, aby była spójna między przeglądarkami i wersjami.Użycie nagłówka pragma w odpowiedzi to opowieść o żonach. RFC2616 definiuje go tylko jako nagłówek żądania
http://www.mnot.net/cache_docs/#PRAGMA
źródło
ZASTRZEŻENIE: Zdecydowanie sugeruję przeczytanie odpowiedzi @ BalusC. Po przeczytaniu następującego samouczka buforowania: http://www.mnot.net/cache_docs/ (polecam też go przeczytać), uważam, że jest poprawny. Jednak ze względów historycznych (i ponieważ sam to przetestowałem) dołączę moją oryginalną odpowiedź poniżej:
Próbowałem „zaakceptowanej” odpowiedzi dla PHP, która nie działała dla mnie. Potem przeprowadziłem małe badania, znalazłem niewielki wariant, przetestowałem go i zadziałało. Oto on:
To powinno działać. Problem polegał na tym, że przy dwukrotnym ustawianiu tej samej części nagłówka, jeśli
false
nie jest on wysyłany jako drugi argument do funkcji nagłówka, funkcja nagłówka po prostu zastąpi poprzednieheader()
wywołanie. Tak więc, ustawiającCache-Control
, na przykład, jeśli nie chce się umieszczać wszystkich argumentów w jednymheader()
wywołaniu funkcji, musi zrobić coś takiego:Zobacz więcej pełnej dokumentacji tutaj .
źródło
W przypadku platformy ASP.NET Core utwórz prostą klasę oprogramowania pośredniego:
następnie zarejestruj to w
Startup.cs
Pamiętaj, aby dodać to gdzieś później
źródło
Dyrektywy te nie ograniczają żadnego ryzyka bezpieczeństwa. Naprawdę mają one zmusić UA do odświeżania lotnych informacji, a nie powstrzymywać UA przed zatrzymywaniem informacji. Zobacz to podobne pytanie . Przynajmniej nie ma gwarancji, że routery, serwery proxy itp. Również nie zignorują dyrektyw buforowania.
Mówiąc bardziej pozytywnie, zasady dotyczące fizycznego dostępu do komputerów, instalacji oprogramowania i tym podobnych sprawią, że wyprzedzisz większość firm pod względem bezpieczeństwa. Jeśli odbiorcy tych informacji są członkami społeczeństwa, jedyną rzeczą, jaką możesz naprawdę zrobić, to pomóc im zrozumieć, że gdy informacja dotrze do ich maszyny, to ta maszyna jest ich odpowiedzialnością, a nie twoją.
źródło
W IE6 jest błąd
Treść 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ź w agencie użytkownika „MSIE 6”)
źródło
RFC dla HTTP 1.1 mówi, że właściwą metodą jest dodanie nagłówka HTTP dla:
Kontrola pamięci podręcznej: brak pamięci podręcznej
Starsze przeglądarki mogą to zignorować, jeśli nie są odpowiednio zgodne z HTTP 1.1. Dla tych możesz wypróbować nagłówek:
Pragma: bez pamięci podręcznej
Ma to również działać w przeglądarkach HTTP 1.1.
źródło
Ustawienie zmodyfikowanego nagłówka http na jakąś datę w 1995 r. Zwykle załatwia sprawę.
Oto przykład:
źródło
Dokumentacja PHP dla funkcji nagłówka zawiera dość kompletny przykład (opracowany przez firmę zewnętrzną):
źródło
Jeśli masz problemy z pobieraniem IE6-IE8 przez SSL i pamięć podręczną: nagłówek no-cache (i podobne wartości) z plikami MS Office, możesz użyć pamięci podręcznej: private, no-store header and return file on POST. To działa.
źródło
w moim przypadku naprawiam problem chromem
gdzie muszę wyczyścić zawartość poprzednich formularzy danych, gdy użytkownicy klikną przycisk Wstecz ze względów bezpieczeństwa
źródło
Akceptowana odpowiedź nie działa w przypadku IIS7 + ze względu na dużą liczbę pytań o to, że nagłówki pamięci podręcznej nie są wysyłane w II7:
I tak dalej
Przyjęta odpowiedź jest poprawna w tym, które nagłówki muszą być ustawione, ale nie w tym, jak muszą być ustawione. W ten sposób działa z IIS7:
Pierwsza linia
Cache-control
jestno-cache
ustawiona na , a druga linia dodaje inne atrybutyno-store, must-revalidate
źródło
Response.Cache.SetAllowResponseInBrowserHistory(false); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetNoStore(); Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
Miałem najlepsze i najbardziej spójne wyniki we wszystkich przeglądarkach, ustawiając Pragma: no-cache
źródło
Nagłówki w odpowiedzi dostarczonej przez BalusC nie uniemożliwiają Safari 5 (i prawdopodobnie także starszym wersjom) wyświetlania zawartości z pamięci podręcznej przeglądarki podczas używania przycisku Wstecz przeglądarki. Aby temu zapobiec, można dodać pusty atrybut procedury obsługi zdarzeń onunload do znacznika body:
Ten hack najwyraźniej psuje pamięć podręczną do tyłu w Safari: Czy po kliknięciu przycisku Wstecz występuje zdarzenie obciążenia przeglądarki?
źródło
Również tylko na wszelki wypadek, upewnij się zresetować
ExpiresDefault
w.htaccess
pliku, jeśli używasz, że aby włączyć buforowanie.Następnie możesz
ExpiresByType
ustawić określone wartości dla plików, które chcesz buforować:Może się to również przydać, jeśli pliki dynamiczne, np. Php itp. Są buforowane przez przeglądarkę i nie możesz zrozumieć, dlaczego. Sprawdzić
ExpiresDefault
.źródło
Oprócz nagłówków rozważ wyświetlanie strony za pośrednictwem protokołu https . Wiele przeglądarek domyślnie nie buforuje https.
źródło
źródło
Aby ukończyć BalusC -> ODPOWIEDŹ Jeśli używasz perla, możesz użyć CGI, aby dodać nagłówki HTTP.
Za pomocą Perla:
Za pomocą apache httpd.conf
Uwaga: kiedy próbowałem użyć html META, przeglądarki zignorowały je i zbuforowały stronę.
źródło
Chcę tylko zaznaczyć, że jeśli ktoś chce zapobiec buforowaniu TYLKO zawartości dynamicznej, dodawanie tych dodatkowych nagłówków powinno być programowo.
Edytowałem plik konfiguracyjny mojego projektu, aby dodać nagłówki bez pamięci podręcznej, ale to także wyłączało buforowanie zawartości statycznej, co zwykle nie jest pożądane. Modyfikacja nagłówków odpowiedzi w kodzie zapewnia buforowanie obrazów i plików stylów.
Jest to dość oczywiste, ale wciąż warte wspomnienia.
I kolejna uwaga. Uważaj przy użyciu metody ClearHeaders z klasy HttpResponse. To może dać ci siniaki, jeśli użyjesz go lekkomyślnie. Jak mi to dało.
Po przekierowaniu na zdarzenie ActionFilterAttribute konsekwencje wyczyszczenia wszystkich nagłówków tracą wszystkie dane sesji i dane w magazynie TempData. Bezpieczniej jest przekierowywać z Akcji lub nie usuwać nagłówków podczas przekierowania.
Z drugiej strony odradzam wszystkim korzystanie z metody ClearHeaders. Lepiej jest usunąć nagłówki osobno. Aby poprawnie ustawić nagłówek Cache-Control, używam tego kodu:
źródło
Nie miałem szczęścia z
<head><meta>
żywiołami. 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.header
wywołań web.py. Celowo zredagowałem mój osobisty, nieistotny kod narzędziowy.źródło
Zobacz ten link do studium przypadku dotyczącego buforowania:
http://securityevaluators.com/knowledge/case_studies/caching/
Podsumowanie, zgodnie z tym artykułem,
Cache-Control: no-store
działa tylko w Chrome, Firefox i IE. IE akceptuje inne formanty, ale Chrome i Firefox nie. Link jest dobrym przeczytaniem wraz z historią buforowania i dokumentowania dowodu koncepcji.źródło
Nie jestem pewien, czy moja odpowiedź brzmi prosto i głupio, a być może była już znana od dawna, ale ponieważ jednym z Twoich celów jest uniemożliwienie komuś korzystania z przycisku Wstecz przeglądarki do przeglądania twoich historycznych stron , możesz:
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 wdrożenia w całej witrynie, ale przynajmniej w przypadku niektórych krytycznych stron możesz to zrobić. Mam nadzieję że to pomoże.
źródło
możesz użyć bloku lokalizacji do ustawienia pojedynczego pliku zamiast buforowania całej aplikacji w IIS
źródło