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.

Author: Peter Mortensen, 2008-09-08

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://. W3 HTML Spec rozdział 5.2.2. Dbaj o to, gdy nie określasz ich programowo, ponieważ serwer WWW może zawierać pewne wartości domyślne.

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.

[[40]}sprawdzanie rzeczywistych nagłówków odpowiedzi HTTP

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:

Chrome developer toolset Monitor ruchu HTTP pokazujący nagłówki odpowiedzi HTTP na stackoverflow.com

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źć.

 2739
Author: BalusC,
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 lub max-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 .

 258
Author: Kornel,
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.

W Firefoksie (v23.0.1) wszystko będzie działać:
  1. Cache-Control: no-store

  2. Cache-Control: no-cache (tylko https)

  3. Pragma: no-cache (tylko https)

  4. Vary: * (https tylko)

W Operze (v12.15) możemy to zrobić tylko przez Cache-Control: must-revalidate (tylko https).

W Safari (v5.1.7, 7534.57.2) każde z nich będzie działać:
  1. Cache-Control: no-store
    <body onunload=""> w html

  2. Cache-Control: no-store (tylko https)

W IE8 (v8.0.6001.18702 IC) każdy z nich będzie praca:

  1. Cache-Control: must-revalidate, max-age=0

  2. Cache-Control: no-cache

  3. Cache-Control: no-store

  4. Cache-Control: must-revalidate
    Expires: 0

  5. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT

  6. Pragma: no-cache (tylko https)

  7. 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:

  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. Cache-Control: no-store
    Fail: Safari 5.1.7, Opera 12.15
    Sukces: Chrome 28, FireFox 23, IE8

  10. Cache-Control: no-store
    <body onunload="">
    Fail: Opera 12.15
    sukces: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  11. Cache-Control: no-cache
    Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    sukces: IE8

  12. Vary: *
    Fail: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    sukces: brak

  13. Pragma: no-cache
    Fail: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    sukces: brak

  14. 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

  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, FireFox 23, Safari 5.1.7, Opera 12.15
    sukces: IE8

  16. Cache-Control: must-revalidate, max-age=0
    Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    sukces: IE8

  17. Cache-Control: must-revalidate
    Expires: 0
    Fail: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    sukces: IE8

  18. 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

  19. 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:

  1. 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

  2. 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

  3. Vary: *
    Fail: Chrome 28, Safari 5.1.7, Opera 12.15
    sukces: FireFox 23, IE8

  4. Pragma: no-cache
    Fail: Chrome 28, Safari 5.1.7, Opera 12.15
    sukces: FireFox 23, IE8

  5. Cache-Control: no-cache
    Fail: Chrome 28, Safari 5.1.7, Opera 12.15
    sukces: FireFox 23, IE8

  6. 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

  7. 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

  8. 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

  9. Cache-Control: must-revalidate
    Fail: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    sukces: Opera 12.15

  10. 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

  11. Cache-Control: must-revalidate, max-age=0
    Fail: Chrome 28, FireFox 23, Safari 5.1.7
    sukces: IE8, Opera 12.15

  12. 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

  13. 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

  14. Cache-Control: no-store
    Fail: Opera 12.15
    sukces: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  15. 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

  16. 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

  17. 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

  18. Cache-Control: must-revalidate
    Expires: 0
    Fail: Chrome 28, FireFox 23, Safari 5.1.7,
    sukces: IE8, Opera 12.15

  19. 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

  20. 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

  21. 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

  22. 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

  23. Cache-Control: no-store, must-revalidate
    Fail: brak
    sukces: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15

 112
Author: Pacerier,
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();
});
 42
Author: Joseph Connolly,
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 .

 29
Author: Chris Vasselli,
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:

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

 23
Author: Edward Wilde,
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

Http://www.mnot.net/cache_docs/#PRAGMA

 9
Author: Dave Cheney,
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 .

 9
Author: Steven Oxley,
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();
 9
Author: kspearrin,
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ą.

 8
Author: Dustman,
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")

 8
Author: Edson Medina,
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.

 7
Author: Chris Dail,
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
 7
Author: Anders Sandvig,
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);
 7
Author: Grey Panther,
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.

 7
Author: Albert,
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

 6
Author: user2321638,
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:

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

 5
Author: JK.,
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

 4
Author: petr k.,
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?

 4
Author: Tobias,
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.

 4
Author: BannerMan,
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.

 3
Author: Harry,
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="*" %>
 3
Author: yongfa365,
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ę.

 1
Author: Carlos Escalera Alonso,
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");
 0
Author: user3253726,
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()

 0
Author: Richard Elkins,
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.

 0
Author: Paul,
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.

 0
Author: elle0087,
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>
 -1
Author: CodeMind,
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.

 -2
Author: Antonio Ooi,
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