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
). Pragma
Tarih ö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-Control
ve Expires
yalnı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-Control
gibi diğer parametreler max-age
önemsizdir Cache-Control
. Buradaki Last-Modified
diğ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 .htaccess
dosyası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:
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 .