Tüm tarayıcılarda web sayfası önbelleğini nasıl kontrol ederiz?


1552

Araştırmalarımız bize tüm tarayıcıların HTTP önbellek yönergelerine aynı şekilde saygı göstermediğini göstermiştir.

Güvenlik nedeniyle bizim uygulamada bazı sayfalar, önbelleğe alınmasını istemiyoruz , hiç web tarayıcısı tarafından. Bunun en azından aşağıdaki tarayıcılarda çalışması gerekir:

  • Internet Explorer 6 ve üstü sürümler
  • Firefox 1.5+
  • Safari 3+
  • Opera 9+
  • Krom

İhtiyacımız bir güvenlik testinden geldi. Web sitemizden çıktıktan sonra geri düğmesine basabilir ve önbelleğe alınmış sayfaları görüntüleyebilirsiniz.


Sadece ipad Safari için, [this] [1] yardımcı olur mu? [1]: stackoverflow.com/questions/24524248/…
Bakhshi

En basiti: max-age = 10. Bu mükemmel değil çünkü sayfa 10 saniye önbelleğe alınacak. Ama buradaki en az "başlık spagetti" çözümü. Ayrıca, bu bazen ters proxy kullanan dinamik web sitelerinde büyük bir performans artışı sağlar. (Yavaş php betiğiniz her 10 saniyede bir çağrılır ve daha sonra ters proxy tarafından önbelleğe alınır. 10 saniyede bir ziyaretçi başına bir kereden çok daha iyidir)
Hello World


3
Bu harika soru için teşekkürler. Merak için, bazı verileri göndermenizi sağlayan durum ne olabilir, ancak alıcının "güvenlik nedenleriyle" kaydetmesini istemezsiniz . onları zaten gönderdin!
Muhasebeci م

1
@ Muhasebeci: senaryosunda kullanıcı oturumu kapatmıştı. Bu Kullanıcı Aracısı'ndaki bir sonraki kullanıcı kullanıcının yeni oturum açmış kişi olacağını kim garanti edebilir?
Fabien Haddadi

Yanıtlar:


2578

Giriş

Bahsedilen tüm istemciler (ve proxy'ler) için çalışan doğru minimum başlık kümesi:

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

Bu Cache-Control, istemciler ve proxy'ler için HTTP 1.1 spesifikasyonuna göre (ve yanında bazı istemciler tarafından örtük olarak gereklidir Expires). PragmaTarih öncesi müşteriler için HTTP 1.0 spec başınadır. Bu Expires, istemciler ve proxy'ler için HTTP 1.0 ve 1.1 spesifikasyonlarına uygundur. HTTP 1.1'de, Cache-Controlöncelik önceliklidir Expires, bu nedenle sonuçta yalnızca HTTP 1.0 proxy'leri içindir.

Yalnızca HTTPS üzerinden sayfa sunarken IE6 ve bozuk önbelleğe almayı umursamıyorsanız no-store, atlayabilirsiniz Cache-Control: no-cache.

Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0

IE6 veya HTTP 1.0 istemcileri (1997'de HTTP 1.1 tanıtıldı) umursamıyorsanız, atlayabilirsiniz Pragma.

Cache-Control: no-store, must-revalidate
Expires: 0

HTTP 1.0 proxy'leri de umursamıyorsanız, atlayabilirsiniz Expires.

Cache-Control: no-store, must-revalidate

Öte yandan, sunucu otomatik olarak geçerli bir Dateüstbilgi içeriyorsa , teorik olarak da atlayabilir Cache-Controlve Expiresyalnızca güvenebilirsiniz .

Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0

Ancak, örneğin, son kullanıcı işletim sistemi tarihini değiştirirse ve istemci yazılımı buna güveniyorsa, bu başarısız olabilir.

Yukarıda belirtilen parametreler belirtilirse , Cache-Controlgibi diğer parametreler max-ageönemsizdir Cache-Control. Buradaki Last-Modifieddiğer yanıtların çoğunda yer alan başlık, yalnızca isteği gerçekten önbelleğe almak istiyorsanız ilginçtir , bu yüzden hiç belirtmeniz gerekmez.

Nasıl ayarlanır?

PHP Kullanımı:

header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.

Java Servlet veya Node.js'yi kullanma:

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.

ASP.NET-MVC Kullanma

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.

ASP.NET Web API'sini kullanma:

// `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()); 

ASP.NET kullanarak:

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.

ASP.NET Core v3'ü kullanma

// 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";

ASP kullanarak:

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.

Ruby on Rails veya Python / Flask kullanma:

headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
headers["Expires"] = "0" # Proxies.

Python / Django kullanma:

response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.

Python / Pyramid kullanma:

request.response.headerlist.extend(
    (
        ('Cache-Control', 'no-cache, no-store, must-revalidate'),
        ('Pragma', 'no-cache'),
        ('Expires', '0')
    )
)

Go'yu kullanma:

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.

Apache .htaccessdosyasını kullanma :

<IfModule mod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>

HTML4 kullanma:

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

HTML meta etiketleri ve HTTP yanıt üstbilgileri

Bir HTTP sayfası üzerinden bir HTML sayfası sunulduğunda ve hem HTTP yanıtı başlıklarında hem de HTML <meta http-equiv>etiketlerinde bir başlık bulunduğunda, HTTP yanıtı başlığında belirtilen sayfanın HTML meta etiketi üzerinde önceliğe sahip olması önemlidir. HTML meta etiketi yalnızca sayfa yerel bir disk dosya sisteminden bir file://URL aracılığıyla görüntülendiğinde kullanılır . Ayrıca bkz. W3 HTML spesifikasyonu bölüm 5.2.2 . Web sunucusu bazı varsayılan değerleri içerebileceğinden, bunları programlı olarak belirtmediğinizde buna dikkat edin.

Genellikle, daha iyi sadece ediyorum değil başlayanlar tarafından önlemek karışıklığa HTML meta etiketlerini belirtmek ve sert HTTP yanıt başlıklarını güveniyor. Ayrıca, özellikle bu <meta http-equiv>etiketler HTML5'te geçersizdir . Yalnızca HTML5 spesifikasyonundahttp-equiv listelenen değerlere izin verilir.

Gerçek HTTP yanıt başlıklarını doğrulama

Birini ve diğerini doğrulamak için, webbrower'ın geliştirici araç setinin HTTP trafik monitöründe görebilirsiniz / hata ayıklama yapabilirsiniz. Chrome / Firefox23 + / IE9 + 'da F12 tuşuna basıp "Ağ" veya "Net" sekme panelini açarak ve sonra HTTP isteği ve yanıtıyla ilgili tüm ayrıntıları ortaya çıkarmak için ilgili HTTP isteğini tıklatarak oraya ulaşabilirsiniz. Aşağıdaki ekran görüntüsü Chrome'dan geçerli:

Stackoverflow.com'da HTTP yanıt başlıklarını gösteren Chrome geliştirici araç seti HTTP trafik monitörü

Bu başlıkları da dosya indirmelerinde ayarlamak istiyorum

Her şeyden önce, bu soru ve cevap "dosya indirme" (PDF, zip, Excel, vb.) Yerine "web sayfalarında" (HTML sayfaları) hedeflenmektedir. Bunları önbelleğe almanız ve değiştirilen bir dosyada yeniden indirmeyi zorlamak için URI yolunda veya sorgu dizgisinde bir yerde bazı dosya sürümü tanımlayıcılarını kullanmanız daha iyi olur. Bu önbellek olmayan başlıkları yine de dosya indirmelerine uygularken, HTTP yerine HTTPS üzerinden dosya indirme hizmeti sunarken IE7 / 8 hatasına dikkat edin. Ayrıntılar için bkz. IE foo.jsf dosyasını indiremiyor. IE bu internet sitesini açamadı. İstenen site kullanılamıyor veya bulunamıyor .


16
Bu tamamlanmış gibi görünmüyor. IE 8'de bu çözümü denedim ve geri düğmesine bastığınızda tarayıcının önbelleğe alınmış bir sürümü yükleyeceğini buldum.
Mike Ottum

16
Muhtemelen test metodolojiniz yanlıştı. Belki de sayfa zaten önbellekte? Belki de başlıklar yanlış / geçersizdi? Belki de yanlış talebe bakıyordunuz? Vb ..
BalusC

8
Aslında, bu yaklaşımın eksik olduğunu ve IE8 ile veya en azından bazı durumlarda sorunlara neden olduğunu onaylıyorum. Özellikle, bir kaynağı SSL üzerinden almak için IE8 kullanırken, IE8 kaynağı ikinci kez getirmeyi reddeder (kullanılan başlıklara bağlı olarak ya hiç veya ilk denemeden sonra). Örneğin, EricLaw'ın bloguna bakın .
haylem

21
Eklemek isterim ki bu aslında Bank of America'nın yaptığı şey. Yanıt başlıklarına bakarsanız ve bunu aspx'e çevirirseniz şunu yaparlar: Response.AppendHeader ("Cache-Control", "no-cache, no-store, must-revalidate"); Response.AppendHeader ("Geçerlilik bitiş tarihi", "Per, 01 Aralık 1994 16:00:00 GMT"); Anlıyorum, eğer onlar için yeterince iyi ise, benim için yeterince iyi.
John

8
@John: Üstbilginin süresi dolmak, HTTP 1.0 belirtimindeki örnek değerdir . Çalışıyor, ancak tam olarak bu zaman damgasını almak biraz saçma.
BalusC

244

(hey, herkes: lütfen sadece bulabileceğiniz tüm başlıkları dikkatsizce kopyalayıp yapıştırmayın)

Her şeyden önce, Geri düğmesi geçmişi bir önbellek değildir :

Tazelik modeli (Bölüm 4.2) tarih mekanizmaları için geçerli değildir. Yani, bir geçmiş mekanizması, süresi dolmuş olsa bile önceki bir gösterimi görüntüleyebilir.

Eski HTTP spesifikasyonunda ifade daha da güçlüydü ve tarayıcılara arka düğme geçmişi için önbellek yönergelerini göz ardı etmelerini söylüyordu.

Kullanıcı zaman geri zaman (zamanda geri gidip gerekiyordu oldu kaydedilir). Daha önce açılmış bir URL'ye gitmez.

Bununla birlikte, uygulamada, önbellek çok özel durumlarda geri düğmesini etkileyebilir:

  • Sayfa gerekir üzerinden sunulması HTTPS aksi takdirde bu güvenilir olmayacaktır Önbellek bozmanın. Ayrıca, HTTPS kullanmıyorsanız, sayfanız birçok şekilde giriş çalmaya karşı savunmasızdır.
  • Göndermeniz gerekir Cache-Control: no-store, must-revalidate(bazı tarayıcılar gözlemler no-storeve bazıları gözlemler must-revalidate)

Sen asla herhangi gerekir:

  • <meta>önbellek üstbilgileriyle - hiç çalışmıyor. Tamamen işe yaramaz.
  • post-check/ pre-check- yalnızca önbelleğe alınabilen kaynaklar için geçerli olan yalnızca IE direktifidir .
  • Aynı başlığı iki kez veya düzine parça halinde gönderme. Bazı PHP snippet'leri aslında önceki başlıkların yerine geçerek yalnızca sonuncunun gönderilmesini sağlar.

İsterseniz şunları ekleyebilirsiniz:

  • no-cacheveya max-age=0kaynak (URL) "bayat" yapacak ve tarayıcıların daha yeni bir sürüm olup olmadığını sunucu ile kontrol etmelerini gerektirecektir ( no-storebunu daha da güçlüdür).
  • ExpiresHTTP / 1.0 istemcileri için geçmişte bir tarihe sahip (ancak gerçek HTTP / yalnızca 1.0 istemcileri bu günlerde tamamen yok olsa da).

Bonus: Yeni HTTP önbellekleme RFC'si .


1
bunun yükleme süresi açısından web sitesinin performansı üzerinde herhangi bir yan etkisi olacak mı? mağaza yok, önbellek yok, yeniden doğrulama nasıl performansı etkiler?
Raman Ghai

@RamanGhai Önbelleği devre dışı bırakmak genellikle performansı düşürür (ve bahsettiğiniz 3 seçeneğin tümü de önbelleği devre dışı bırakır). CDN'leri ve ISS proxy'lerini (örneğin, mobil operatörler tarafından yaygın olarak kullanılan) etkisiz hale getirebilir. Yeni bir kullanıcı tarafından ilk yüklemeye zarar vermez (proxy sorununun yanı sıra), ancak sonraki gezinme çok daha yavaş olabilir.
Kornel

@porneL, göndermemiz gerektiğini söylüyorsun Cache-Control: must-revalidate. Zaten ima ettiğinden Cache-Control: no-cacheberi neden göndermiyorsun ? w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1no-cachemust-revalidate
Pacerier

3
İlişkisi @Pacerier no-cacheile must-revalidateönbelleği için doğrudur, fakat geri geçmişi bir önbellek değildir. Tarayıcılar, must-revalidategeçmiş davranışını kontrol etmek için özel durum özelliğine sahiptir .
Kornel

@porneL, Hmm İstenen davranış olduğunu belirten destekleyici bir RFC var mı?
Pacerier

103

@Kornel'in belirttiği gibi, önbelleği devre dışı bırakmak değil, geçmiş arabelleğini devre dışı bırakmaktır. Farklı tarayıcıların geçmiş arabelleğini devre dışı bırakmak için kendi ince yolları vardır.

Chrome'da (v28.0.1500.95 m) bunu yalnızca ile yapabiliriz Cache-Control: no-store.

FireFox'ta (v23.0.1) bunlardan herhangi biri çalışacaktır:

  1. Cache-Control: no-store

  2. Cache-Control: no-cache (yalnızca https)

  3. Pragma: no-cache (yalnızca https)

  4. Vary: * (yalnızca https)

Opera'da (v12.15) bunu yalnızca Cache-Control: must-revalidate(https) ile yapabiliriz.

Safari'de (v5.1.7, 7534.57.2) bunlardan herhangi biri çalışır:

  1. Cache-Control: no-store
    <body onunload=""> html'de

  2. Cache-Control: no-store (yalnızca https)

IE8'de (v8.0.6001.18702IC) bunlardan herhangi biri çalışacaktır:

  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 (yalnızca https)

  7. Vary: * (yalnızca https)

Yukarıdakileri birleştirmek bize Chrome 28, FireFox 23, IE8, Safari 5.1.7 ve Opera 12.15 için çalışan bu çözümü sunar: Cache-Control: no-store, must-revalidate (yalnızca https)

Https'nin gerekli olduğunu unutmayın, çünkü Opera düz http sayfaları için geçmiş arabelleğini devre dışı bırakmaz. Gerçekten https alamıyorsanız ve Opera'yı görmezden gelmeye hazırsanız, yapabileceğiniz en iyi şey şudur:

Cache-Control: no-store
<body onunload="">

Aşağıda testlerimin ham günlükleri gösterilmektedir:

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="">
    Başarısız: Opera 12.15
    Başarı: 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="">
    Başarısız: Opera 12.15
    Başarı: 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: *
    Başarısız: Safari 5.1.7, Opera 12.15
    Başarı: 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: *
    Başarısız: Safari 5.1.7, Opera 12.15
    Başarı: 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="">
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Başarı: 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="">
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Başarı: 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="">
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Başarı: 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="">
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Başarı: IE8

  9. Cache-Control: no-store
    Başarısız: Safari 5.1.7, Opera 12.15
    Başarı: Chrome 28, FireFox 23, IE8

  10. Cache-Control: no-store
    <body onunload="">
    Başarısız: Opera 12.15
    Başarı: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  11. Cache-Control: no-cache
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Başarı: IE8

  12. Vary: *
    Başarısızlık: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Başarı: yok

  13. Pragma: no-cache
    Başarısızlık: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Başarı: yok

  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="">
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Başarı: 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="">
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Başarı: IE8

  16. Cache-Control: must-revalidate, max-age=0
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Başarı: IE8

  17. Cache-Control: must-revalidate
    Expires: 0
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Başarı: IE8

  18. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Başarı: IE8

  19. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Başarısızlık: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Başarı: yok

HTTPS:

  1. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Başarısızlık: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Başarı: yok

  2. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    Başarısızlık: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Başarı: yok

  3. Vary: *
    Başarısız: Chrome 28, Safari 5.1.7, Opera 12.15
    Başarı: FireFox 23, IE8

  4. Pragma: no-cache
    Başarısız: Chrome 28, Safari 5.1.7, Opera 12.15
    Başarı: FireFox 23, IE8

  5. Cache-Control: no-cache
    Başarısız: Chrome 28, Safari 5.1.7, Opera 12.15
    Başarı: FireFox 23, IE8

  6. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Başarısız: Chrome 28, Safari 5.1.7, Opera 12.15
    Başarı: FireFox 23, IE8

  7. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    Başarısız: Chrome 28, Safari 5.1.7, Opera 12.15
    Başarı: 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: *
    Başarısız: Chrome 28, Safari 5.1.7, Opera 12.15
    Başarı: FireFox 23, IE8

  9. Cache-Control: must-revalidate
    Başarısız: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Başarı: Opera 12.15

  10. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    <body onunload="">
    Başarısız: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Başarı: Opera 12.15

  11. Cache-Control: must-revalidate, max-age=0
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7
    Başarı: 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="">
    Başarısız: Chrome 28, Safari 5.1.7
    Başarı: 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="">
    Başarısız: Chrome 28, Safari 5.1.7
    Başarı: FireFox 23, IE8, Opera 12.15

  14. Cache-Control: no-store
    Başarısız: Opera 12.15
    Başarı: 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="">
    Başarısız: Opera 12.15
    Başarı: 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="">
    Başarısız: Opera 12.15
    Başarı: 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: *
    Başarısız: Chrome 28, Safari 5.1.7, Opera 12.15
    Başarı: FireFox 23, IE8

  18. Cache-Control: must-revalidate
    Expires: 0
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7,
    Başarı: IE8, Opera 12.15

  19. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7,
    Başarı: IE8, Opera 12.15

  20. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7,
    Başarı: 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="">
    Başarısızlık: Chrome 28, FireFox 23, Safari 5.1.7,
    Başarı: IE8, Opera 12.15

  22. Cache-Control: private, must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Başarısız: Chrome 28, Safari 5.1.7
    Başarı: FireFox 23, IE8, Opera 12.15

  23. Cache-Control: no-store, must-revalidate
    Başarısız: yok
    Başarı: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15


3
Bu birkaç yıl önce gönderildi biliyorum ama ilginç bir okuma oldu. Bu sorun beni birkaç aydır deli ediyor, vücut önbellek kontrolü ile nasıl başa çıkacağını gerçekten biliyor gibi görünüyor. Kullanan birkaç kişi gördüm <body onunload="">ama asıl sorunun etrafında bir yol gibi görünüyor. HTTPS kullanırsanız, bu şekilde çalışmalı mı? Sorunun en çok ortaya çıktığı yer safari.
Ürdün

4
@Jordan, HTTPS'niz varsa yukarıdaki günlüklere göre eklemek Cache-Control: no-storehile yapar. <body onunload="">yalnızca HTTPS'niz olmadığında gerekir.
Pacerier

37

Web.config yolunu kullanışlı buldum (cevaba eklemeye çalıştım, ancak buraya gönderme kabul edilmiyor gibi görünüyor)

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

Ve işte aynısını yapmanın ekspres / node.js yolu:

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();
});

Web.config için, yalnızca dinamik olarak yüklendiğini / requirjs kullanarak bildiğimiz komut dosyalarına özel başlıkları uygulamak için biraz değişiklik yapardım. Komut dosyalarınızın istemci klasöründe bulunduğu varsayılarak: <location path = "client"> ..... </location>
Ibrahim ben Salah

Kim için ne web.confolduğunu merak ediyor olabilir : Bir ASP.NETweb uygulaması için ana ayarlar ve yapılandırma dosyasıdır . Kök dizinde bulunan bir XML belgesidir. ( wiki ).
başka bir

27

Bu sayfadaki tüm cevapların hala sorun yaşadığını tespit ettim. Özellikle, hiçbirinin geri düğmesine basarak eriştiğinizde IE8'in sayfanın önbelleğe alınmış bir sürümünü kullanmasını durduramayacağını fark ettim.

Çok fazla araştırma ve testten sonra, gerçekten ihtiyacım olan sadece iki başlığın:

Cache-Control: no-store
Vary: *

Vary başlığının açıklaması için http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6 adresini ziyaret edin.

IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4 ve Opera 9-10'da, bu başlıklar sayfanın bağlantısını tıkladığınızda veya URL'yi yerleştirdiğinizde sayfanın sunucudan istenmesine neden oldu doğrudan adres çubuğunda. Bu , Ocak '10 itibariyle kullanılmakta olan tüm tarayıcıların yaklaşık % 99'unu kapsar .

IE6 ve Opera 9-10'da, geri düğmesine basılması yine de önbelleğe alınan sürümün yüklenmesine neden oldu. Test ettiğim diğer tüm tarayıcılarda, sunucudan yeni bir sürüm getirdiler. Şimdiye kadar, geri düğmesine bastığınızda bu tarayıcıların sayfaların önbelleğe alınmış sürümlerini döndürmemesine neden olacak bir başlık kümesi bulamadım.

Güncelleme: Bu cevabı yazdıktan sonra, web sunucumuzun kendisini bir HTTP 1.0 sunucusu olarak tanımladığını fark ettim. Listelediğim üstbilgiler, HTTP 1.0 sunucusundan gelen yanıtların tarayıcılar tarafından önbelleğe alınmaması için doğru bilgilerdir. Bir HTTP 1.1 sunucusu için BalusC'nin cevabına bakın .


4
Bu IE8'in geri düğmesi için çalışır !! Her diğer öneri için her şeyi denedikten sonra "Vary: *" üstbilgisi eklemek görünüşe göre kullanıcı geri düğmesine bastığında IE8 sayfayı yeniden yüklemeye zorlayabilir tek şeydir. Ve bu does 1.1 sunucularında / HTTP üzerinde çalışmaya.
coredumperror

BarlusC tarafından önerilen üstbilgiler ve onPageShow olayı "kalıcı" özniteliğiyle (Safari için gerekli) tetiklendiğinde window.location.reload () öğesini çağıran bir JS snippet'i ile birleştiğinde, test ettiğim her tarayıcı başarıyla yeniden yüklemeyi zorlar kullanıcı Geri düğmesini kullandığında.
coredumperror

1
@CoreDumpError, oh JavaScript'in etkin olduğunu varsaymamalısınız.
Pacerier

@Pacerier Cevabı 2010'da yazdığım sırada, bu, hem Safari'nin hem de Opera'nın en son sürümleri üzerinde çalıştı ve sunucumuz kendisini HTTP 1.0 sunucusu olarak tanımladı. Ne yazık ki, artık bunu kolayca test etmenin bir yolu yok, bu yüzden bu tarayıcıların en son sürümleri hakkında kesin bir şey söyleyemem.
Chris Vasselli

Test ettiğiniz tarayıcı sürümleri nelerdi?
Pacerier

21

Biraz araştırma yaptıktan sonra, çoğu tarayıcıyı kapsayan görünen aşağıdaki başlık listesini bulduk:

ASP.NET'te bunları aşağıdaki snippet'i kullanarak ekledik:

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 

Bulunan: http://forums.asp.net/t/1013531.aspx


36
@bart: Daha da zahmetli, 26 Temmuz 1997'de bir Cumartesi değil, bir Pazartesi
günüydü

5
Cache-Control: no-cacheve Cache-Control: privateçatışma - asla ikisini bir araya getirmemelisiniz: birincisi tarayıcılara ve proxy'lere hiç önbelleklememelerini söyler, ikincisi proxy'lere önbelleklememelerini söyler, ancak tarayıcıların kendi özel kopyalarını tutmasına izin verir. Tarayıcının hangi ayarı izleyeceğinden emin değilim, ancak tarayıcılar ve sürümler arasında tutarlı olması olası değildir.
Keith

Ön kontrol ve son kontrol kullanmayın. blogs.msdn.com/b/ieinternals/archive/2009/07/20/…
EricLaw

Bu benim için işe yaramadı - asp.net 4.5 kullanarak kod çalışır, ancak gerekli sonucu üretmez. Bunu takip etmek zorunda kaldım: stackoverflow.com/questions/22443932/…
Andy

8

Cevapta pragma başlığının kullanımı bir eş hikayesidir. RFC2616 bunu yalnızca bir istek başlığı olarak tanımlar

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


4
Bu, özelliklerin ötesine geçmeniz için iyi bir örnektir. Özellikler her zaman kristal netliğinde olsaydı, StackOverflow gibi siteler için fazla bir nokta olmazdı. Gönderen Microsoft no-cache başlığı: HTTP 1.0 sunucuları ile geriye dönük uyumluluk amacıyla, Internet Explorer HTTP Pragma özel kullanımını destekler. İstemci sunucuyla güvenli bir bağlantı (https: //) üzerinden iletişim kurarsa ve sunucu yanıtla birlikte bir Pragma: no-cache üstbilgisi döndürürse, Internet Explorer yanıtı önbelleğe almaz.
michaelok

@michaelok: Başvurunuz geçerlidir, ancak daha büyük noktayı kaçırır - Uygun bir Önbellek Denetimi / Sona erme süresi ayarlayın ve pragmaya ihtiyacınız yoktur.
EricLaw

8

YASAL UYARI: @ BalusC'un cevabını okumanızı şiddetle tavsiye ediyorum. Aşağıdaki önbellek eğitimini okuduktan sonra: http://www.mnot.net/cache_docs/ (Ben de okumanızı tavsiye ederim), doğru olduğuna inanıyorum. Ancak, tarihsel nedenlerle (ve kendim test ettiğim için) orijinal cevabımı aşağıya ekleyeceğim:


Benim için işe yaramadı PHP için 'kabul edilen' cevabını denedim. Sonra biraz araştırma yaptım, hafif bir varyant buldum, test ettim ve işe yaradı. İşte burada:

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');

Bu işe yaramalı. Sorun, üstbilginin aynı bölümünü iki kez ayarlarken, falseüstbilgi işlevine ikinci bağımsız değişken olarak gönderilmezse, üstbilgi işlevinin önceki header()çağrının üzerine yazmasıdır . Bu nedenle, Cache-Controlörneğin, tüm argümanları bir header()işlev çağrısına koymak istemiyorsa , böyle bir şey yapması gerekir:

header('Cache-Control: this');
header('Cache-Control: and, this', false);

Daha ayrıntılı belgelere buradan bakın .


14
Bu efsanelerle dolu. ön kontrol ve son kontrol yalnızca IE içindir, yalnızca önbelleğe alınan yanıtlar için geçerlidir ve 0 değeri işlem yapılmaz. max-stale, sunucu yanıt üstbilgisi değil, proxy istek üstbilgisidir. Son kullanma tarihi yalnızca tek bir değeri kabul eder. Birden fazla bu başlık göz ardı edilir.
Kornel

1
@porneL, bu mitleri doğru bir şekilde ele alan rakip bir cevap gönderecek misiniz?
08:56

@Odthinking, stackoverflow.com/questions/49547/… rakip bir cevap gibi görünüyor .
Mike Ottum

@ Pacerer evet, feragatnamede söylediğim gibi BalusC'nin cevabını kullanın.
Steven Oxley

8

ASP.NET Core için basit bir ara katman sınıfı oluşturun:

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

sonra ile kayıt ol Startup.cs

app.UseMiddleware<NoCacheMiddleware>();

Bunu daha sonra bir yere eklediğinizden emin olun

app.UseStaticFiles();

Dize değişmezleri "Cache-Controls", "Pragma" ve "Expires" yerine Microsoft.Net.Http.Headers.HeaderNames sabitlerini kullanmanızı öneririm.
Victor Sharovatov

7

Bu yönergeler herhangi bir güvenlik riskini azaltmaz. Gerçekten de UA'ları, UA'ların bilgi elde etmekten alıkoymak yerine geçici bilgileri yenilemeye zorlamaları amaçlanıyor. Benzer soruyu görün . En azından hiçbir yönlendiricinin, vekilin vb. Önbellek yönergelerini de göz ardı etmeyeceğine dair bir garanti yoktur.

Daha olumlu bir not olarak, bilgisayarlara fiziksel erişim, yazılım kurulumu ve benzerleriyle ilgili politikalar, sizi güvenlik açısından birçok firmanın önüne koyacaktır. Bu bilginin tüketicileri halkın üyesiyse, yapabileceğiniz tek şey, bilginin makinelerine çarptığında, o makinenin sizin değil , onların sorumluluğunda olduğunu anlamalarına yardımcı olmaktır .


7

IE6'da bir hata var

"Content-Encoding: gzip" içeren içerik, "Cache-Control: no-cache" kullansanız bile her zaman önbelleğe alınır.

http://support.microsoft.com/kb/321722

IE6 kullanıcıları için gzip sıkıştırmasını devre dışı bırakabilirsiniz ("MSIE 6" için kullanıcı aracısına bakın)


6

HTTP 1.1 için RFC , doğru yöntemin aşağıdakiler için bir HTTP Üstbilgisi eklemek olduğunu söylüyor:

Önbellek Kontrolü: önbellek yok

Eski tarayıcılar, HTTP 1.1 ile tam olarak uyumlu değilse bunu göz ardı edebilir. Bunlar için başlığı deneyebilirsiniz:

Pragma: önbellek yok

Bunun HTTP 1.1 tarayıcıları için de çalışması gerekiyor.


1
Teknik özellik, yanıtın yeniden doğrulama olmadan yeniden kullanılmaması gerektiğini belirtir. Yanıtın ilk etapta bir önbellekte saklanmadığını gösteren resmi yöntem olan Cache-Control: no-store.
AnthonyWJones

6

Değiştirilmiş http üstbilgisini 1995'te bir tarihe ayarlamak genellikle işe yarar.

İşte bir örnek:

Sona eriyor: Çar, 15 Kas 1995 04:58:08 GMT
Son Değiştirme Tarihi: Çar, 15 Kas 1995 04:58:08 GMT
Önbellek Kontrolü: önbellek yok, yeniden doğrulamalı

1
Uzun zaman önce Last-Modified ayarının önbellekleme üzerinde hiçbir etkisi yoktur, sezgisel revalidasyon nedeniyle önbelleğe alınan bir yanıtın daha uzun süre kullanılmasına izin vermek dışında.
EricLaw

6

Başlık fonksiyonu için PHP belgelerine oldukça tam bir örnek (bir üçüncü kişi tarafından katkıda) var

    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);

11
Bu kesinlikle yanlış. Expires, Cache-control ve Pragma için header () öğesine yapılan ikinci çağrılar önceden ayarlanan değerlerin tamamen üzerine yazılır.
Kornel

1
@porneL: Hayır, önceki parametre değerlerini geçersiz kılmamasını söyleyen 2. parametre olarak false değerini geçerken önceden ayarlanan değerlerin üzerine yazma.
Julien Palard

1
@JulienPalard yorumumu yaptıktan sonra cevap düzenlendi. Hala pek bir anlam ifade etmiyor.
Kornel

9'dan önce IE'de çalışmak istiyorsanız, birden fazla Önbellek Kontrolü başlığı göndermeyin. HİÇBİR ön kontrol veya son kontrol göndermeyin. blogs.msdn.com/b/ieinternals/archive/2009/07/20/…
EricLaw

6

SSL ve önbellek üzerinden IE6-IE8 ile indirme sorunları yaşıyorsanız: MS Office dosyalarıyla önbellek yok (ve benzer değerler) önbellek kullanabilirsiniz: POST isteği üzerine önbellek: özel, depo yok üstbilgi ve dönüş dosyası. İşe yarıyor.


6

benim durumumda chrome ile bu sorunu çözdüm

<form id="form1" runat="server" autocomplete="off">

kullanıcılar güvenlik nedenleriyle geri düğmesini tıklattığında önceki form verilerinin içeriğini temizlemem gerekiyor


Mozilla 19.x tarayıcı sorunum da kod snippet'i ile çözüldü. Otomatik tamamlama = "kapalı". Teşekkür ederim.
Satya

5

Kabul edilen yanıt, II7'de gönderilmeyen önbellek başlıklarıyla ilgili çok sayıda sorudan sonra IIS7 + için çalışmıyor gibi görünüyor:

Ve bunun gibi

Kabul edilen cevap, hangi başlıkların ayarlanması gerektiği doğrudur, ancak nasıl ayarlanmaları gerektiği konusunda doğru değildir. Bu şekilde IIS7 ile çalışır:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "-1");

Setleri ilk satırı Cache-controliçin no-cache, ve ikinci satır diğer özelliklerini eklerno-store, must-revalidate


Bu benim için çalışıyor:Response.Cache.SetAllowResponseInBrowserHistory(false); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetNoStore(); Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
Vilx-

4

Pragma: no-cache ayarlayarak tüm tarayıcılarda en iyi ve en tutarlı sonuçları aldım


4

BalusC tarafından verilen yanıttaki başlıklar, tarayıcının geri düğmesini kullanırken Safari 5'in (ve muhtemelen daha eski sürümlerin) tarayıcı önbelleğinden içerik görüntülemesini engellemez. Bunu önlemenin bir yolu, gövde etiketine boş bir onunload olay işleyicisi niteliği eklemektir:

<body onunload=""> 

Bu saldırı görünüşe göre Safari'deki ileriye dönük önbelleği bozuyor: Geri düğmesini tıkladığınızda çapraz tarayıcı onload olayı var mı?


Harika, test ettim ve bu aslında Safari'de (5.1.7) çalışıyor, ancak Opera'da çalışmıyor.
Pacerier

4

Ayrıca, yalnızca iyi bir ölçü için, önbelleğe almayı etkinleştirmek için kullanıyorsanız, dosyanızdaki sıfırlamayı ExpiresDefaultunutmayın .htaccess.

ExpiresDefault "access plus 0 seconds"

Daha sonra, ExpiresByTypeönbelleğe almak istediğiniz dosyalar için belirli değerler ayarlamak için kullanabilirsiniz :

ExpiresByType image/x-icon "access plus 3 month"

Bu, php vb. Dinamik dosyalarınız tarayıcı tarafından önbelleğe alınıyorsa ve bunun nedenini anlayamıyorsanız da kullanışlı olabilir. Kontrol edin ExpiresDefault.


3

Üstbilgilere ek olarak, sayfanıza https yoluyla sunulmayı düşünün . Birçok tarayıcı varsayılan olarak https'yi önbelleğe almaz.


3
//In .net MVC
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult FareListInfo(long id)
{
}

// In .net webform
<%@ OutputCache NoStore="true" Duration="0" VaryByParam="*" %>

2

BalusC -> CEVAP tamamlamak için Perl kullanıyorsanız, HTTP üstbilgileri eklemek için CGI kullanabilirsiniz.

Perl Kullanımı:

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

Apache httpd.conf kullanma

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

Not: Html META'yı kullanmaya çalıştığımda, tarayıcılar onları görmezden geldi ve sayfayı önbelleğe aldı.


0

Sadece birisi SADECE dinamik içeriğin önbelleğe alınmasını önlemek istiyorsa, bu ek başlıkları eklemenin programlı olarak yapılması gerektiğini belirtmek isterim.

Önbelleksiz üstbilgiler eklemek için projemin yapılandırma dosyasını düzenledim, ancak bu genellikle istenmeyen statik içeriği önbelleğe almayı da devre dışı bıraktı. Koddaki yanıt başlıklarını değiştirmek, görüntülerin ve stil dosyalarının önbelleğe alınmasını sağlar.

Bu oldukça açık, ama yine de söz etmeye değer.

Ve başka bir uyarı. HttpResponse sınıfından ClearHeaders yöntemini kullanırken dikkatli olun. Eğer pervasızca kullanırsanız size çürükler verebilir. Bana verdiği gibi.

ActionFilterAttribute olayına yeniden yönlendirdikten sonra, tüm üstbilgileri temizlemenin sonuçları TempData deposundaki tüm oturum verilerini ve verilerini kaybediyor. Bir Eylemden yönlendirmek daha güvenlidir veya yönlendirme yapılırken üstbilgileri temizlemez.

İkinci düşüncede ClearHeaders yöntemini kullanmaktan vazgeçiyorum. Başlıkları ayrı ayrı kaldırmak daha iyidir. Ve Cache-Control üstbilgisini düzgün ayarlamak için bu kodu kullanıyorum:

filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");

0

<head><meta>Elementlerle şansım yoktu . HTTP önbelleğiyle ilgili parametreleri doğrudan eklemek (HTML dokümanı dışında) gerçekten işe yarar.

Python'da web.py web.headerçağrılarını kullanan örnek kod aşağıdadır. Kişisel ilgisiz hizmet kodumu kasten düzelttim.

    web'i içe aktar
    ithalat sys
    ithalat KİŞİSEL ARAÇLAR

    myname = "main.py"

    url'ler = (
        '/', 'ana sınıf'
    )

    main = web.application (urls, globals ())

    render = web.template.render ("şablonlar /", taban = "düzen", önbellek = Yanlış)

    main_class sınıfı (nesne):
        def GET (öz):
            web.header ("Önbellek kontrolü", "önbellek yok, depo yok, yeniden doğrulamalı")
            web.header ("Pragma", "önbellek yok")
            web.header ("Son kullanma tarihi", "0")
            return render.main_form ()

        def POST (öz):
            msg = "GÖNDERİLDİ:"
            form = web.input (işlev = Yok)
            web.header ("Önbellek kontrolü", "önbellek yok, depo yok, yeniden doğrulamalı")
            web.header ("Pragma", "önbellek yok")
            web.header ("Son kullanma tarihi", "0")
            return render.index_laid_out (tebrik = msg + form.function)

    __name__ == "__main__" ise:
        nargs = len (sys.argv)
        # Python program adından sonra yeterli sayıda bağımsız değişken bulunduğundan emin olun
        nargs! = 2 ise:
            LOG-AND-DIE ("% s: Komut satırı hatası, nargs =% s, 2 olmalı", myname, nargs)
        # TCP bağlantı noktası numarasının sayısal olduğundan emin olun
        Deneyin:
            tcp_port = int (sys.argv [1])
        e istisnası hariç:
            LOG-AND-DIE ("% s: tcp_port = int (% s) başarısız oldu (tam sayı değil)", myname, sys.argv [1])
        # Herşey iyi!
        JUST-LOG ("% s:% d bağlantı noktasında çalışıyor", ad, tcp_port)
        web.httpserver.runsimple (main.wsgifunc (), ("localhost", tcp_port))
        main.run ()


Sitede yıllardır verilen cevaplarda bu pek çok kez ele alınmamış mı?
Martin Tournoij

META yönergeleri Internet Explorer ve Edge 18 ve önceki sürümlerinde çalışır. Modern tarayıcılar onları desteklemez. crbug.com/2763
EricLaw

0

Önbellekleme ile ilgili bir Vaka Çalışması bağlantısına bakın:

http://securityevaluators.com/knowledge/case_studies/caching/

Özet, makaleye göre, yalnızca Cache-Control: no-storeChrome, Firefox ve IE'de çalışıyor. IE diğer kontrolleri kabul eder, ancak Chrome ve Firefox kabul etmez. Bağlantı, önbelleğe alma ve kavram kanıtını belgeleme tarihi ile iyi bir okumadır.


0

Cevabım basit ve aptalca gelip gelmediğinden emin değilim ve belki de uzun zaman önce biliniyordu, ancak birisinin geçmiş sayfalarınızı görüntülemek için tarayıcı geri düğmesini kullanmasını önlemek hedeflerinizden biri olduğundan, şunları kullanabilirsiniz:

window.location.replace("https://www.example.com/page-not-to-be-viewed-in-browser-history-back-button.html");

Tabii ki, bu tüm siteye uygulanamayabilir, ancak en azından bazı kritik sayfalar için bunu yapabilirsiniz. Bu yardımcı olur umarım.


-1

IIS'de tüm uygulamayı önbelleğe almak yerine tek tek dosya ayarlamak için konum bloğunu kullanabilirsiniz

 <location path="index.html">
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Cache-Control" value="no-cache" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
  </location>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.