2011-06-14 17 views
19

Aşağıdaki durum için HTTP önbellek başlıklarını formüle etme konusunda sorun yaşıyorum.HTTP: Sona erme ve doğrulama önbelleğini birleştirme

Sunucumuzda, haftada birkaç kez değişen büyük veriler var. Tarayıcıların bu verileri önbelleğe almasını istiyorum. Ek olarak, ağ güvenilir olmadıkça koşullu hale gelen gecikmeyi en aza indirmek istiyorum.

Peşinde olduğum uç davranış şudur:

  1. Müşteri daha önce görmediği bir kaynak ister.
  2. Sunucu, ETag ve max-age (24 saat) ile birlikte kaynakla yanıt verir.
  3. 24 saat geçene kadar istemci önbelleğe alınmış kaynak kullanacaktır. Son kullanım tarihinden sonra
  4. , istemci doğrulayıcı bir isteği gerçekleştirecektir (If-None-Match: [etag])
  5. kaynak değişmemişse: 304 Not Modified
  6. istemci nasılsa mevcut kaynak yeni süre sonu olduğu bildirilir ile
    • sunucusu yanıt tarihinin şu andan itibaren 24 saat
    • dönüş adıma 3

Özgününe kadar aşağı düşeni ... bir 304 cevap yeni bir max-age içerebilir? Veya sonraki istekler için max-age onurlandırıldı mı?

cevap

29

Evet, 304 yanıtı yeni bir max-age (veya ETag veya bu konuyla ilgili diğer yanıt başlıkları) içerebilir.

Orijinal max-age'in veya yeni birisinin onurlandırıldığını test etmek için Firefox 4'ü kullanarak bir deneme yaptım ve yanıt, yeni max-age'un onurlandırılmasıydı, bu yüzden ne yapmak istediğinizi uygulayabilmeniz gerekiyordu.

O max-ageDate tepki başlığına göreli olduğunu hatırlamak önemlidir, değil Last-Modified, bu nedenle sunucu 24 saatlik bir max-age direktif, bu söylediğini ayarlar her "24 saat Şu andan itibaren." Yani, istediğinizi varsayın, max-age'unuzu değiştirmek zorunda kalmayacaksınız, her zaman 86400'ü dönmeniz gerekmeyecek.

Her halükarda, denemem için bir genel bakış ve döküm. Temel olarak, bir ETag ayarlayan ve max-age ila 120 saniye olarak ayarlanan bir test URL'sine girdim. Buna göre, sunucu bu yanıtı başlıklarıyla sayfasını döndürdü:

HTTP/1.1 200 OK 
Date: Tue, 14 Jun 2011 23:48:51 GMT 
Cache-Control: max-age=120 
Etag: "901ea3d0ac9303ae4855a09676f96701" 
Last-Modified: Mon, 13 Jun 2011 22:20:03 GMT 

Sonra sayfayı yüklemek (ama sert bir yeniden kuvvet değil) için adres çubuğunda "Enter" tuşuna tekrarladı. Firefox, sayfayı önbellekten tekrar tekrar yüklediğinden ağ trafiği yoktu. Sonra, 120 saniye geçtikten sonra, bir dahaki sefere girdiğimde, Firefox bunun yerine beklediğiniz gibi sunucuya bir şartlı GET gönderdi. sunucudan istek ve yanıt vardı: 304 yanıt olarak, ben 240 120 saniye sunucu değişikliği max-age yaşadığınız

GET /example HTTP/1.1 
If-Modified-Since: Mon, 13 Jun 2011 22:20:03 GMT 
If-None-Match: "901ea3d0ac9303ae4855a09676f96701" 

HTTP/1.1 304 Not Modified 
Date: Tue, 14 Jun 2011 23:50:54 GMT 
Etag: "901ea3d0ac9303ae4855a09676f96701" 
Cache-Control: max-age=240 

Not.

Yani, büyük soru, 120 saniye sonra ne olur? Firefox yeni max-age'a saygı duyar ve sayfayı önbellekten yüklemeye devam eder mi, yoksa sunucuya mı saldırırdı? Başka bir 240 saniyelik döngüsü boyunca tekrarlanan ve işler beklediğiniz gibi çalıştı

GET /example HTTP/1.1 
If-Modified-Since: Mon, 13 Jun 2011 22:20:03 GMT 
If-None-Match: "901ea3d0ac9303ae4855a09676f96701" 

HTTP/1.1 304 Not Modified 
Date: Tue, 14 Jun 2011 23:54:56 GMT 
Etag: "901ea3d0ac9303ae4855a09676f96701" 
Cache-Control: max-age=240 

: cevabım önbellekten sayfa yüklenirken devam etti ve 240 saniye ulaşılmıştır sonrasına kadar-isteğini yeniden vermedi olmasıdır. Yani, umarım bu soruya cevap verir.

RFC, yaş hesaplamalarının nasıl gerçekleştirileceğini ve diğer Önbellek Denetimi parametrelerinin nasıl çalıştığını açıklar. Her tarayıcı ve proxy'nin kuralları izleyeceğine dair bir garanti yoktur, ancak bu noktada HTTP 1.1 oldukça eskidir ve çoğunun Firefox'un yaptığı gibi yapmasını beklersiniz.

(Not: Bu örnekte Sadelik sağlamak için, böyle konak, bağlantı/canlı tutma, içerik kodlama/uzunluk/tipi, kullanıcı aracısı vb gibi alakasız başlıkları sildiğiniz döker)

+1

"Ben daha sonra sayfayı yüklemek için adres çubuğuna "gir" isabetini tekrarlayın (ancak zor bir yeniden yükleme zorlamayın). - Bu, deneyi kendim yapmak için ihtiyacım olan önemli bilgi parçasıydı! İyi araştırılmış cevap için teşekkürler! – roufamatic

+3

FireFox ile anlattığınız şeyi yeniden keşfettim. Chrome ile, konum çubuğuna "gir" kelimesine basmak yine de 304'e neden oldu. Başka bir sayfaya gittim (ör. Google.com) ve ardından geri düğmesine basmak, önbellek davranışını istenen şekilde gösterecektir. (İlginçtir, eğer sayfama "ileri" tuşuyla ulaşırsam, ALWAYS önbelleklenmiş dosyayı görüntüledi.) – roufamatic

+0

Teşekkürler, bu Chrome hakkında iyi bir bilgi. Eğer test ediyorsanız yapmanız gereken en önemli şey, kullanıcılarınız ne yaparsanız simüle etmeye çalışmaktır. Eğer linkleri tıklamak, linkleri tıklamak (direkt trafik), referans verilere göre tahmin edebileceğiniz bir şeydir. her ikisi de geçerli önbellekten yüklenir). Ve tarayıcı tarafından yıkmak. Ya da sadece Firefox/Chrome'a ​​güvenin ve HTTP'yi istediğiniz gibi doğru bir şekilde uyguladığınız için mutlu olun. – joelhardi