Cache-Control: max-age = 0 ve no-cache arasındaki fark nedir?


Yanıtlar:


598

Aynı soruyu sordum ve aramalarımda bazı bilgiler buldum (sorunuz sonuçlardan biri olarak geldi). İşte belirlediklerim ...

Cache-ControlBaş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ı").


Kaynak sunucu tarafından gönderildiğinde

İnanıyorum max-age=0basitçe tepki dan bayat önbelleğe (ve kullanıcı arayüzleri) anlatıyor olsun-go ve çok GEREKEN tepkisini revalidate (örn. İle If-Not-Modifiedbaşlığındaki) önbelleğe alınmış bir kopyasını kullanmadan önce, oysa no-cacheonlar 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 Warningbaşlık eklemeleri gerektiğine inanıyorum ), ancak no-cachene 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-cacheDepolamayı 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-revalidatetemelde 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-cacheno-cacheno-store


Kullanıcı aracısı tarafından gönderildiğinde

Ş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-Modifiedbaş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 .


9
Önbellek Kontrolü olmaz mı: max-age = 0, yeniden doğrulamalı, proxy-yeniden doğrulamalı önbelleksizliğin tam eşdeğeri olur mu?
Didier A.

1
Harika bir cevap, sitenizdeki makaleyi okumaya gittim ancak sayfa artık geçerli değil. palisade.plynt.com/issues/2008Temmuz/cache-control-attributes
Craig London

7
Teşekkürler, @CraigLondon. Önbelleğe alınmış bir sürüme yönlendirdim.
Michael Krebs

2
must-revalidateno-cacheveya 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.
Patanjali

3
@Patanjali 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.
Franklin Yu

57

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.


31
Bu yanlış. shift-refresh, daha çok benzeyen sert bir yenilemedirno-store
Michael

3
Chrome 49.0.2623.87 m gibi Shift + Yenileme sırasında da "Pragma: no-cache" gönderen Firefox 45.0'da doğrulandı.
Cees Timmerman

34

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 .


4
Benzer şekilde, https üzerinden önbellek kullanılmadığında IE 8 her türlü "indirilemedi" sorunuyla karşılaşır. önerilen çözünürlükler bazen başlıkların max-age = 0 olarak değiştirilmesini içerir
Robert Christ

28

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-cacheyanı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-cachegibi görünüyor no-store.

Squid Cache, varsayılan olarak, no-cachetı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-cacheTamamen 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=0ya da kullanıyorlar no-cache.


2
Şifre korumalı içerik için en iyi cevap. private,max-age=0.
dana

21
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 :)


12

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


İyi bir nokta, ama pratikte herhangi bir tarayıcı bunu gerçekten yapıyor mu?
Pacerier

3
@Pacerier Bunun Vernik, Kalamar, Trafik vb. Proxy sunucularını önbelleğe almak için daha fazla olduğunu düşünüyorum
Hank Gay

12

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.


css ve js, üretim sistemlerinde olduğu gibi önbellekleme için uygun adaylardır, gerçekten sık sık değişmemelidirler. Bununla birlikte, gelişirken önbellekleme yapmak bir acıdır, çünkü bu etkinlik sık sık zorla önbellek yıkamaları gerektirebilir. Ancak, farklı ortamlar için farklı ayarlar kullanılamazsa, en çok etkiye sahip olduğu için üretim gereksinimleri öncelikli olmalıdır, çünkü çok sayıda erişim, birkaç geliştiricinin sahip olacağı birkaç Ctrl-F5 yenilemesine kıyasla bant genişliğini koruyacaktır. yapmak. Ancak, gerçek zamanlı verilerin sorgulanması için önbellek denetiminin düzgün çalışması gerekir.
Patanjali

0

(Şaşırtıcı bir şekilde) bahsedilmeyen bir şey, bir talebin max-staledirektif 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-cachegerçekten max-staleönbellek yeniden doğrulamak ZORUNLU olduğu için istemci tarafından eski veriler için herhangi bir istek (ile ) koz .


-2

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.


9
Anladığım kadarıyla, 'önbelleksizin' depolamayı önleyeceği DEĞİLDİR ('depolamasız' bunu başarmanın doğru yoludur). Bazı tarayıcılar 'önbellek yok' ifadesini 'mağaza yok' olarak mı yorumluyor? Bu, 'max-age = 0' ın ​​neden sadece 'önbelleksiz' yerine kullanıldığını açıklar
rubyruy

3
Bu yanlış. Yukarıyı görmek. Bazı tarayıcılar / sunucular, önbelleğe alma özelliğini mağaza değil olarak uygulamayı seçebilir , ancak tümünü değil.
Jeremy Kauffman

4
Tek güvenli yol, max-age=0önbelleğe almaya izin verildiğini, ancak kaynağın yeniden doğrulanması gerektiğini ve no-storeyanıtın önbellekte saklanmasını istemiyorsanız kullanmaktır. no-cacheRasgele kullanıcı aracısı satıcı ve versiyon numarası ve transfer protokolü bağlı olarak bunlardan birini ifade etmek için tayin edilmiştir.
Mikko Rantalainen

Firefox ne zaman mağaza yok?
Cees Timmerman
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.