Farklı kaynak türleri için ideal HTTP önbellek kontrol başlıkları


82

"Tüm" önbelleklerle ve tarayıcılarla (ayrıca HTTPS kullanırken !) Çalışan minimal bir başlık kümesi bulmak istiyorum.

Web sitemde üç tür kaynağım olacak:

(1) Her zaman önbelleğe alınabilir (herkese açık / tüm kullanıcılar için eşit)

Örnek: 0A470E87CC58EE133616F402B5DDFE1C.cache.html ( GWT tarafından otomatik olarak oluşturulmuştur )

  • Bu dosyalar, içeriği değiştirdiklerinde otomatik olarak yeni bir ad atanır (MD5'e göre).

  • HTTPS kullanırken bile mümkün olduğunca önbelleğe alınmaları gerekir (bu yüzden Cache-Control: public, özellikle Firefox için ayarlamam gerektiğini varsayıyorum ?)

  • İçerik değişmişse, istemcinin doğrulama için sunucuya bir gidiş dönüş yapmasını gerektirmemelidir.

(2) Ara sıra değiştirme (herkese açık / tüm kullanıcılar için eşit)

Örnekler: index.html, mymodule.nocache.js

  • Bu dosyalar, sitenin yeni bir sürümü dağıtıldığında URL'yi değiştirmeden içeriklerini değiştirir.

  • Önbelleğe alınabilir, ancak muhtemelen her seferinde yeniden doğrulanması için bir gidiş-dönüş yolculuğuna ihtiyaç duyarlar.

(3) Her istek için bireysel (özel / kullanıcıya özel)

Örnek: JSON yanıtları

  • Bu kaynaklar hiçbir koşulda şifrelenmemiş olarak diske alınmamalıdır. (Bunun dışında, önbelleğe alınabilecek birkaç özel isteğim olabilir.)

Muhtemelen her tür için hangi başlıkları kullanacağım hakkında genel bir fikrim var, ancak her zaman eksik olabileceğim bir şey var.


Cevaplarınız, yorumlarınız ve bağlantılar için teşekkürler. Hala biraz deney yapıyorum ama sanırım bir çözüm bulabileceğim!
Chris Lercher

2
3 numaraya ulaşmak genellikle mümkün değildir.
EricLaw

Yanıtlar:


91

Muhtemelen şu ayarları kullanırdım:

  1. Cache-Control: max-age=31556926- Temsiller herhangi bir önbellek tarafından önbelleğe alınabilir. Önbelleğe alınan temsilin 1 yıl için yeni olduğu kabul edilecektir:

    Bir yanıtı "asla sona ermiyor" olarak işaretlemek için, bir kaynak sunucu yanıtın gönderildiği tarihten yaklaşık bir yıl sonra bir Sona Erme tarihi gönderir . HTTP / 1.1 sunucuları , bir yıldan daha uzun bir süre sonra Sona Erme tarihlerini GÖNDERMEMELİDİR .

  2. Cache-Control: no-cache- Temsillerin herhangi bir önbellek tarafından önbelleğe alınmasına izin verilir. Ancak önbelleklerin, önbelleğe alınmış bir kopyayı yayınlamadan önce doğrulama için kaynak sunucuya isteği göndermesi gerekir.
  3. Cache-Control: no-store - Önbellekler hiçbir koşulda sunumu önbelleğe almamalıdır.

Daha fazla bilgi için Mark Nottingham'ın Önbelleğe Alma Eğitimine bakın .


1
@Gumbo: Kesinlikle emin olduğum bir şey , Firefox 3 + 'nın HTTPS kullanırken genel dosyaları diskte önbelleğe almasını istediğimde herkese açık olarak ayarlamam gerektiğidir : stackoverflow.com/questions/174348/…
Chris Lercher

2
IE gibi bazı tarayıcılar, Cache-Control: no-cache'i depolanmamış gibi ele almaya başlıyor. Kuşkusuz bu, RFC'ye göre değildir, ancak hassas verilerin diskte şifrelenmemiş olarak depolanmasını önlemek için MANY tarafından yapılan önbelleksiz hatayı "düzeltmek" için bilerek yapılmıştır.
AviD

1
@chris_l, bu bağlantıya rastladım: palisade.plynt.com/issues/2008Jul/cache-control-attributes . Önceki sürümlerin nasıl davrandığını hatırlamıyorum, ancak bunu IE7'nin de yaptığını düşünüyorum.
AviD

2
Ayrıca Firefox, HTTPS kaynaklarını önbelleğe almak için Cache-Control'de artık PUBLIC gerektirmez. Ancak genel olarak yapacağınız en iyi şey, sitenizi trafiği izlerken, örneğin Fiddler ile test etmektir.
EricLaw

3
100 yıllık bir önbellek kontrol değerinin ayarlanması tavsiye edilmez. Öncelikle, teknik özellikler maksimum 1 yıl önermektedir. İkinci olarak, 68 yılı aşan herhangi bir değer, IE8 ve altı için derhal sona erme ile sonuçlanır: blogs.msdn.com/b/ieinternals/archive/2010/01/26/…
EricLaw

-2

Birinci ve ikinci vakalar aslında aynı senaryodur. Cache-Control: publicSonsuza dek sürecek değişmez kaynaklara sahip olmak için sitenin yapı numarasını / sürümünü içeren bir URL belirlemeli ve sonra oluşturmalısınız. Ayrıca Expires, müşterinin bir yenileme kontrolü yapmasına gerek kalmaması için başlığı bir yıl veya daha uzun bir süre içinde ayarlamak istersiniz .

Durum 3 için, maksimum esneklik için aşağıdakilerin tümünü yapabilirsiniz:

"Cache-Control", "no-cache, must-revalidate"
"Expires", 0
"Pragma", "no-cache"

Yeni derlemeler için farklı URL'ler muhtemelen bir seçenek değildir: a) Bu, istemciyi sonsuza kadar önbelleğe alınabilen dosyaları yeniden indirmeye zorlar. Bundan kaçınmak için benzersiz isimler alıyorlar. b) Sitemin ana URL'si sadece https://www.example.com/c) Yer imlerinin her zaman sitemin en yeni sürümüne başvurmasını istiyorum (bir yığın akışı sorusunun yer imlerinin sitenin yapı numarasını içereceğini düşünün).
Chris Lercher

Merhaba Chris, Bu yaklaşım genellikle belgeler yerine CSS ve JS kaynakları için kullanılır. Bunun belge tanımlayıcılar için geçerli olmadığını kabul ediyorum, bu durumda önbellek kontrolünü genel, Son Değiştirilmiş ve başlıklarda etag ayarlamanız gerekir, bu her seferinde bir tazelik kontrolüne neden olur ve herhangi bir değişiklik yoksa yalnızca bir 304 gönderilecektir. son indirmeden beri. Alternatif olarak, her sayfadaki gerçek dinamik sayfa içeriğini JS yoluyla indirebilir, böylece etkili önbelleğe almaya devam ederken URL'yi koruyabilirsiniz.
Andrew L

Evet, hemen hemen bu şekilde, GWT bunu benim için halleder: index.html'm (ara sıra değişir) mymodule.nocache.js'yi (ara sıra değişir) içerir ve bu, sonsuza kadar önbelleğe alınabilir doğru dosyaları (js'nin büyük parçaları, GWT tarafından yönetilir) görüntü paketleri, ...) Bana bıraktığı tek şey, her tür için doğru http başlıklarını ayarlamaktır. Transfer hacminin büyük bir yüzdesini oluşturdukları için bu başlıkları minimuma indirmek istiyorum. Bu yüzden hem Last-Modified örneğin gerek yok ve ETag vb?
Chris Lercher

"Expires" aslında 0 sayısı değil tarih olmalıdır. "Date" başlığıyla aynı değere sahip olmalıdır. Bkz. Mnot.net/cache_docs
Luke Hutchison
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.