Yanıtlar:
Aynı soruyu sordum ve aramalarımda bazı bilgiler buldum (sorunuz sonuçlardan biri olarak geldi). İşte belirlediklerim ...
Cache-Control
Başlığın iki tarafı vardır . Bir tarafı web sunucusu tarafından gönderilebildiği yerdir (aka. "Kaynak sunucu"). Diğer taraf tarayıcı tarafından gönderilebildiği yerdir (aka. "Kullanıcı aracısı").
İnanıyorum max-age=0
basitçe tepki dan bayat önbelleğe (ve kullanıcı arayüzleri) anlatıyor olsun-go ve çok GEREKEN tepkisini revalidate (örn. İle If-Not-Modified
başlığındaki) önbelleğe alınmış bir kopyasını kullanmadan önce, oysa no-cache
onlar söyler GEREKİR bir önbelleğe alınmış kullanmadan önce revalidate kopyalayın. Gönderen 14.9.1 Ne Cacheable olduğunu :
no-cache
... önbellek, kaynak sunucu ile başarılı bir şekilde yeniden doğrulama yapılmadan sonraki bir isteği karşılamak için yanıtı KULLANMAMALIDIR. Bu, bir başlangıç sunucusunun istemci isteklerine eski yanıtlar döndürmek üzere yapılandırılmış önbellekler tarafından bile önbelleğe alınmasını engellemesine olanak tanır.
Başka bir deyişle, önbellekler bazen eski bir yanıt kullanmayı seçebilir (ancak daha sonra bir Warning
başlık eklemeleri gerektiğine inanıyorum ), ancak no-cache
ne olursa olsun eski bir yanıt kullanmalarına izin verilmediğini söylüyor. Beyzbol istatistikleri bir sayfada oluşturulduğunda belki SHOULD davranışını doğrulamak istersiniz , ancak ZORUNLU bir e-ticaret satın yanıtı oluşturduktan zaman -revalidate davranış.
no-cache
Depolamayı engellemeyeceğinizi söylediğinizde yorumunuzda doğru olmanıza rağmen , aslında kullanırken başka bir fark olabilir no-cache
. Önbellek Kontrol Yönergeleri Demystified adlı bir sayfaya rastladım (doğruluğunu kefil edemiyorum):
Uygulamada IE ve Firefox, tarayıcıya sayfayı önbelleğe almama talimatı veriyormuş gibi önbelleksiz yönergeyi ele almaya başladılar. Bu davranışı yaklaşık bir yıl önce gözlemlemeye başladık. Bu değişikliğin, önbelleğe almayı önlemek için bu yönergenin yaygın (ve yanlış) kullanımından kaynaklandığından şüpheleniyoruz.
...
Son zamanlarda "cache-control: no-cache" nin "no-store" yönergesi gibi davranmaya başladığına dikkat edin.
Bir yana, bana öyle geliyor ki Cache-Control: max-age=0, must-revalidate
temelde aynı anlama geliyor Cache-Control: no-cache
. Öyleyse, belki de aynı şeyi (yani, hiçbir önbellekleme yok) yapmak için görünür bir geçişten kaçınırken , ZORUNLU -veya doğru davranışını elde etmenin bir yolu ?no-cache
no-cache
no-store
Şahkalpesh'in cevabının kullanıcı aracısı tarafı için geçerli olduğuna inanıyorum . Ayrıca 13.2.6 Birden Çok Yanıtı Kesinleştirmeye de bakabilirsiniz .
Bir kullanıcı aracısı Cache-Control: max-age=0
(aka. "Uçtan uca yeniden doğrulama") ile bir istek gönderirse , yol boyunca her önbellek If-Not-Modified
başlangıç sunucusuna kadar önbellek girişini (örn. Üstbilgiyle) yeniden doğrular . Yanıt 304 (Değiştirilmedi) ise, önbelleğe alınan varlık kullanılabilir.
Öte yandan, Cache-Control: no-cache
(aka. "Uçtan uca yeniden yükleme") ile istek gönderilmesi yeniden doğrulanmaz ve sunucu yanıt verirken önbelleğe alınmış bir kopya KULLANMAMALIDIR .
must-revalidate
no-cache
veya ile aynı DEĞİLDİR no-store
. İkincisi bypass önbellekleri tamamen, ancak birincisi, bir önbelleğin her zaman tazelik açısından kontrol edilmesi gerektiğini söyler, ancak hala güncelse, kullanılabilir, böylece bant genişliği tasarrufu sağlanır. İkincisi, gereksiz bant genişliğini alarak ve yanıtları geciktirerek, sürekli olarak uçtan uca indirmeleri zorlar.
no-cache
değil en azından değil tüm tarayıcılarda, "bypass tamamen önbelleğe" ya da "tam uçtan uca indirmeler hep zorlamak". Spesifikasyon sadece tarayıcının önbelleği doğrulaması gerektiğini söylüyor.
Max-yaş = 0
Bu, Yenile'yi tıklatmaya eşdeğerdir , yani en son kopyaya sahip değilseniz bana en son kopyayı ver.
no-cache
Bu, Yenile'yi tıklatırken Shift tuşunu basılı tutar , yani ne olursa olsun her şeyi yeniden yapın.
no-store
Eski soru şimdi, ama başka biri benim yaptığım gibi bir arama ile karşılaşırsa, IE9 geri ve ileri düğmelerini kullanırken kaynakların davranışını yapılandırmak için bunu kullanacak gibi görünüyor. Tüm max-yaş = 0 kullanılan bir geri / ileri basına bir kaynak görüntülerken, tarayıcı son sürümünü kullanacaktır. Önbellek yoksa kullanılır, kaynak refetched edilecektir.
IE9 önbellekleme ile ilgili daha fazla ayrıntı bu msdn önbellekleme blog gönderisinde görülebilir .
IE8 ve Firefox 3.5 ile yaptığım son testlerimde, her ikisinin de RFC uyumlu olduğu görülüyor. Ancak, kaynak sunucuya "dostlukları" farklıdır. IE8, no-cache
yanıtları aynı semantikle ele alır max-age=0,must-revalidate
. Bununla birlikte, Firefox 3.5, performans ve bant genişliği kullanımı için berbat no-cache
gibi görünüyor no-store
.
Squid Cache, varsayılan olarak, no-cache
tıpkı Firefox gibi, başlıklı hiçbir şey saklamaz .
Tavsiyem public,max-age=0
, her istekte tazelik açısından kontrol etmek istediğiniz hassas olmayan kaynakları ayarlamak , ancak yine de önbelleğe almanın performans ve bant genişliği avantajlarına izin vermek olacaktır. Aynı değerlendirmeye sahip kullanıcı başına öğeler için kullanın private,max-age=0
.
no-cache
Tamamen kullanımından kaçınırdım, çünkü bazı tarayıcılar ve popüler önbellekler tarafından işlevsel eşdeğerine piç haline getirilmiş gibi görünüyorno-store
.
Ayrıca, Akamai ve Limelight'ı taklit etmeyin. Esasen birincil işleri olarak büyük önbellek dizileri çalıştırıyorlarsa ve uzman olmalılarsa da, aslında ağlarından daha fazla verinin indirilmesine neden olma konusunda hak kazanmışlardır. Google da öykünme için iyi bir seçim olmayabilir. Kaynağa bağlı olarak rasgele kullanıyor max-age=0
ya da kullanıyorlar no-cache
.
private,max-age=0
.
max-age Bir ara önbellek bir maks-age = 0 yönergesi ile yeniden doğrulamaya zorlandığında kendi önbellek girdisini ve istemci istekte kendi doğrulayıcısını sağladı, sağlanan doğrulayıcı şu anda önbellek girdisinde saklanan doğrulayıcıdan farklı olabilir. Bu durumda, önbellek herhangi bir doğrulayıcıyı kendi isteğini yerine getirirken kullanabilir anlamsal şeffaflığı etkileyen. Ancak, doğrulayıcı seçimi performansı etkileyebilir. En iyi yaklaşım istekte bulunurken kendi doğrulayıcısını kullanmak için ara önbellek. Sunucu cevap verirse 304 (Değiştirilmedi) ile önbellek şimdi onaylanmış kopyasını istemciye döndürebilir 200 (OK) yanıtı ile. Sunucu yeni bir varlık ve önbellek doğrulayıcıyla yanıt verirse, ancak, ara önbellek döndürülen doğrulayıcıyı sağlanan önbellekle karşılaştırabilir. güçlü karşılaştırma işlevini kullanarak müşterinin isteği. İstemcinin doğrulayıcısı kaynak sunucununkine eşitse, ara önbellek yalnızca 304 değerini döndürür (Not Değiştirilmiş). Aksi takdirde, 200 (OK) yanıtı olan yeni varlığı döndürür. Bir önbellek no yönergesi içeriyorsa, en az tazelik içermemelidir, maks-bayat veya maks-yaş.
nezaket: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4
Bunu cevap olarak kabul etme - Gerçek kullanımını anlamak için okumalıyım :)
Ben önbellekleme uzmanı değilim, ama Mark Nottingham öyle. İşte onun önbellek belgeleri . Ayrıca Referanslar bölümünde mükemmel bağlantıları vardır.
Bu dokümanlar benim okuma dayanarak, benziyor max-age=0
önbellek yakın yeterince "Aynı zaman" anlamına gelir birlikte önbelleğe eşzamanlı bakmak "Aynı zamanda" de geldi isteklerine önbelleğe alınmış yanıt göndermesini sağlar, ancak verebilir no-cache
olmaz .
Bu arada, bazı mobil cihazların, özellikle iPhone / iPad gibi Apple ürünlerinin önbellek yok, mağaza yok, Sona erme tarihi: 0 veya süreleri tekrar kullanılmaya zorlamaya çalışabileceğiniz diğer başlıkları tamamen görmezden geldiğini belirtmek gerekir. form sayfaları.
Bu, bir kullanıcının iPad'inin bir form işleminden geçtikleri bir sayfada uyumaya devam etmesini, adım 2 / 3'ü söylemesini sağlamaya çalıştığımız ve ardından cihazın mağazayı / önbellek direktifleri ve anlayabildiğim kadarıyla, sayfanın sanal bir anlık görüntüsünü son durumundan alır, yani açık bir şekilde söylenenleri görmezden gelir ve sadece bu değil, saklanmaması gereken bir sayfa alır ve gerçekte tekrar kontrol etmeden saklamak, diğer şeylerin yanı sıra her türlü garip Oturum sorununa yol açar.
Ben sadece birisi gelir ve neden bu alanda en kötü suçlular gibi görünüyor özellikle iPhone ve ipads ile oturum hataları alıyorum anlayamıyorum durumunda ben ekliyorum.
Bu sorunla oldukça kapsamlı bir hata ayıklayıcı testi yaptım ve bu benim sonucum, cihazlar bu yönergeleri tamamen görmezden geliyor.
Düzenli kullanımda bile, bazı cep telefonlarının da, Expires: 0 diyerek yeni sürümleri kontrol edemediğini ve sonra yeni bir tane alması gerekip gerekmediğini belirlemek için son değiştirilen tarihleri kontrol ettiklerini gördüm.
Bu sadece gerçekleşmiyor, bu yüzden yapmak zorunda kaldığım güncellemeleri zorlamak için gerekli css / js dosyalarına sorgu dizeleri eklemekti, bu aptal mobil cihazları sahip olmadığı bir dosya olduğunu düşünmeye itiyor: benim: ccs / js güncellemesi için .css? v = 1, ardından v = 2. Bu büyük ölçüde işe yarıyor.
Kullanıcı tarayıcıları da, bu arada, 2016'dan itibaren, varsayılan olarak bırakılırsa, sürekli olarak keşfettiğim gibi (sitemizde bir çok değişiklik ve güncelleme yapıyoruz) da bu tür dosyalardaki son değiştirilme tarihlerini kontrol edemiyor, ancak sorgu string yöntemi bu sorunu düzeltir. Bu, tarayıcılarında temel normal kullanıcı varsayılanlarını kullanma eğiliminde olan ve css / js vb. İle önbellek sorunları hakkında hiçbir farkındalığı olmayan müşteriler ve ofis insanlarıyla fark ettiğim bir şey, neredeyse değişmeden yeni css / js'yi alamıyorlar, yani çoğunlukla MSIE / Firefox için tarayıcılarının varsayılanları yapmaları gerekenleri yapmıyorlar, değişiklikleri yok sayıyorlar ve son değiştirilen tarihleri yok sayıyorlar ve Expires: 0 açıkça ayarlanmış olsalar bile doğrulamıyorlar.
Bu, birçok iyi teknik bilgiye sahip iyi bir iş parçacığıydı, ancak bu şeylere yönelik desteğin özellikle mobil cihazlarda ne kadar kötü olduğunu not etmek de önemlidir. Birkaç ayda bir, aldıkları başlık komutlarını takip edememelerine veya bu komutları uygun şekilde birbirine bağlayamamalarına karşı daha fazla koruma katmanı eklemeliyim.
(Şaşırtıcı bir şekilde) bahsedilmeyen bir şey, bir talebin max-stale
direktif kullanarak, eski verileri kabul edeceğini açıkça gösterebileceğidir . Bu durumda, sunucu yanıt verdiyse, max-age=0
önbellek yalnızca yanıt bayatını dikkate alır ve istemcinin [potansiyel olarak bayat veri isteyen) talebini karşılamak için kullanmakta serbesttir. Buna karşılık, eğer sunucu gönderirse no-cache
gerçekten max-stale
önbellek yeniden doğrulamak ZORUNLU olduğu için istemci tarafından eski veriler için herhangi bir istek (ile ) koz .
Fark, önbelleksizliğin (Firefox'ta depolanmayan) her türlü önbelleği engellemesidir. Güvenli içeriğe sahip sayfaların diske yazılmasını önlemek ve geri düğmesiyle tekrar ziyaret edilmelerine rağmen her zaman güncellenmesi gereken sayfalar için yararlı olabilir.
max-age = 0, bir önbellek girişinin eski olduğunu ve yeniden doğrulama gerektirdiğini, ancak önbelleğe almayı engellemediğini gösterir. Tarayıcılar kaynakları tarayıcı oturumu başına yalnızca bir kez doğrular, böylece site yeni bir oturumda ziyaret edilene kadar içerik güncellenmeyebilir.
Genellikle, tarayıcı önbelleği dolduğunda daha yeni içerik alanını geri kazanmadıkça, tarayıcılar süresi dolmuş önbellek girdilerini silmez. Depolama yok, önbellek kullanılmadan bir önbellek girdisinin açıkça silinmesine izin verir.
max-age=0
önbelleğe almaya izin verildiğini, ancak kaynağın yeniden doğrulanması gerektiğini ve no-store
yanıtın önbellekte saklanmasını istemiyorsanız kullanmaktır. no-cache
Rasgele kullanıcı aracısı satıcı ve versiyon numarası ve transfer protokolü bağlı olarak bunlardan birini ifade etmek için tayin edilmiştir.