Önbelleksiz ve tekrar doğrulaması arasındaki fark


179

RFC 2616'dan

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

no-cache

Önbellek içermeyen yönerge bir alan adı belirtmezse, önbellek, kaynak sunucu ile başarılı bir yeniden doğrulama olmadan 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.

Böylece ajanları tüm yanıtları yeniden doğrulamaya yönlendirir .

Bunu ile karşılaştırıldı

mutlaka revalidate

Önbellek tarafından alınan bir yanıtta must-revalidate yönergesi mevcut olduğunda, bu önbellek girdiyi bayatladıktan sonra ilk olarak özgün sunucu ile yeniden doğrulamadan yanıt vermemek için KULLANMAMALIDIR.

Böylece ajanları eski yanıtları yeniden doğrulamaya yönlendirir .

Özellikle, ilgili olarak no-cache, kullanıcı aracıları bu direktif üzerine gerçekten de bu yönergeyi ampirik olarak ele alıyor mu?

Ne anlamı var no-cacheolmadığını must-revalidateve max-age?

Bu yoruma bakın:

http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/

no-cache

Bu yönerge, tarayıcıya sayfayı önbelleğe almama talimatı veriyor gibi görünse de, ince bir fark vardır. RFC'ye göre “önbellek yok” yönergesi, tarayıcıya sayfayı önbellekten sunmadan önce sunucuyla yeniden doğrulaması gerektiğini bildirir. Yeniden doğrulama, uygulamanın bant genişliğini korumasını sağlayan düzgün bir tekniktir. Tarayıcının önbelleğe aldığı sayfa değişmediyse, sunucu bunu tarayıcıya bildirir ve sayfa önbellekten görüntülenir. Bu nedenle, tarayıcı (en azından teoride) sayfayı önbelleğinde saklar, ancak yalnızca sunucuyla yeniden doğruladıktan sonra görüntüler. 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 konuda daha resmi bir şey var mı?

Güncelleme

Mutlaka yeniden direktif yönergesi, yalnızca temsile ilişkin bir isteğin doğrulanmaması, sessizce gerçekleştirilmeyen bir finansal işlem gibi yanlış işlemle sonuçlanabiliyorsa sunucular tarafından kullanılmalıdır.

Bu, şimdiye kadar hiç kalbe almadığım bir şey. RFC, hafifçe tekrar doğrulamamayı söylüyor. Mesele şu ki, web hizmetleriyle, olumsuz bir görünüm almalı ve bilinmeyen istemci uygulamalarınız için en kötüsünü almalısınız. Eski kaynakların soruna neden olma potansiyeli vardır.

Ve Son Değişiklik veya ETag'ler olmadan az önce düşündüğüm başka bir şey, tarayıcı yalnızca tüm kaynağı tekrar alabilir. Ancak ETags ile Chrome'un en azından her istekte yeniden doğrulanmış gibi göründüğünü gözlemledim. Bu da, hem bu direktifleri tartışmalı hem de en azından kötü adlandırılmış yapar, çünkü istek yine de 'daima yeniden doğrulamaya' neden olan diğer başlıkları da içermedikçe düzgün bir şekilde yeniden doğrulayamazlar.

Sadece son noktayı daha açık hale getirmek istiyorum. Sadece must-revalidatebir ETag veya Last-Modified ayarlayarak ancak dahil etmeyerek, aracı, içeriği karşılaştırmak için sunucuya gönderecek hiçbir şeyi olmadığından yalnızca içeriği tekrar alabilir.

Ancak, ampirik testlerim ETag veya değiştirilmiş başlık verileri yanıtlara dahil edildiğinde, ajanın must-revalidatebaşlığın varlığına bakılmaksızın her zaman yine de yeniden doğruladığını göstermiştir .

Dolayısıyla, must-revalidatebayat olduğunda bir 'bypass önbelleği' zorlamaktır, bu sadece bir ömür / yaş ayarladığınızda gerçekleşebilir, bu nedenle must-revalidateyaş veya diğer üstbilgileri olmayan bir yanıt üzerine ayarlanırsa, o no-cachezamandan beri etkili bir şekilde eşdeğer hale gelir. cevap derhal bayat kabul edilecektir.

- Sonunda Gili'nin cevabını işaretleyeceğim!


Yani teoride farktır validate-daima vs validate-if-bayat , pratikte no-cache belirli tarayıcılar tarafından tedavi alır oysa alıntı açıklama olarak söylediği gibi hiç validate size seçim yapmak gerekir böylece ... kullanımına olanların hangi pratikte hangi önbellekleme davranışına ulaşmak istediğinize bağlı olarak…
CBroe

Lütfen greenbytes.de/tech/webdav/… adresini okuyun ve bunun sizin için bir şey olup olmadığını netleştirin.
Julian Reschke


yanıt için bu karar ağacını kontrol edin stackoverflow.com/a/49925190/3748498
pravdomil

Yanıtlar:


191

Bunun şu must-revalidateanlama geldiğine inanıyorum :

Önbellek sona erdiğinde, eski yanıtların kabul edilebilir olduğunu söyleseler bile kullanıcıya eski yanıtlar döndürmeyi reddedin.

Halbuki no-cache:

must-revalidate artı yanıtı hemen bayat olur.

Bir yanıt 10 saniye önbelleğe alınabiliyorsa, 10 saniye sonra must-revalidatedevreye girer, oysa 0 saniye sonra no-cacheifade edilir must-revalidate.

En azından benim yorumum bu.


2
Şimdi böyle görüyorum. İlginç kısım, bir ETag veya Last-Modified olmadan son param, ajanın önbellekte olanı doğrulamak için kullanacak hiçbir şeyi yok ve tüm yükü tekrar indirmesi gerekiyor. Bu yüzden, RFC muhtemelen "yeniden doğrula" dediği zaman, yeniden getir.
Luke Puplett

44
Bu da demek oluyor max-age=0, must-revalidateve no-cacheaynı
Anshul

5
@Anshul, ilk başta 'max-age = 0, revalidate olmalı ve önbelleksiz aynı' diye haklı olduğunu düşündüm, ama bunun doğru olmadığını belirten Jeffrey Fox'un cevabına bakın.
Don Hatch

2
@Anshul Hayır must-revalidateve no-cacheyeni yanıtlar için farklı bir anlama sahip olun: Önbelleğe alınmış bir yanıt taze ise (yani yanıtın süresi dolmamışsa), must-revalidateproxy'nin sunucuyla yeniden doğrulama yapmadan hemen hizmet vermesini sağlarken no-cacheproxy ile tazeliğe bakılmaksızın önbelleğe alınan yanıt. Kaynak: "HTTP - Kesin Kılavuz", sayfa 182-183.
Matthias Braun

8
@MatthiasBraun Ah, karışıklığın kaynağını görebiliyorum. Belki de no-cachemax-age=0, must-revalidate
yazmalıyım

24

max-age=0, must-revalidateve no-cachetam olarak aynı değildir. İle must-revalidate, sunucu bir yeniden doğrulama isteğine yanıt vermezse, tarayıcının / proxy'nin 504 hatası döndürmesi gerekir. İle no-cache, sadece kullanıcı tarafından tercih edilecek olan önbelleğe alınmış içeriği gösterecektir (hiçbir şeyden daha eski bir şeye sahip olmak daha iyidir). Bu nedenle must-revalidateyalnızca kritik işlemler için tasarlanmıştır.


10
Yorumunuzdan emin değilim no-cache. Gönderen RFC 7234 "no-cache" yanıt yönergesi yanıt kökenli sunucu üzerinde başarılı doğrulama yapılmadan müteakip isteği karşılamak için kullanılmış olmamalıdır belirtir. Bu, bir başlangıç ​​sunucusunun, eski yanıtlar göndermek üzere yapılandırılmış önbellekler tarafından bile, bir istekle iletişim kurmadan karşılamak için önbelleğin kullanılmasını engellemesine olanak tanır. Bu, kısıtlamalara benzermust-revalidate
Anshul

9
Jeffrey, uygulamaların nasıl tanımladığını gösterdiğine dair kanıtlara sahip mi?
OrangeDog

Bu cevabın proxy / lb sunucuları için doğru olduğunu düşünüyorum. Ama aslında, tarayıcılar bu durumda 504 döndürmez.
Yann Dìnendal

Yani must-validatearacımust-refresh
Simon_Weaver

15

Jeffrey Fox'un yorumu ile no-cache, 52.0.2743.116 m krom altında test ettik, sonuç, no-cacheaynı davranışa sahip olduğunu gösteriyor, sunucuya erişilemediğinde must-revalidatehepsi yerel önbelleği KULLANMAYACAKTIR ve hepsinin musluk tarayıcısı sırasında önbellek kullanamayacağı / Sunucuya erişilemediğinde ilet düğmesi. Yukarıdaki gibi, bence max-age=0, must-revalidateaynıdır no-cacheazından uygulanmasında,.


Sunucu yeniden doğrulamaya hazır olduğunda Chrome yerel önbelleği kullanır mı? (örneğin, "Değiştirilmişse-Beri"). Her iki durumda da?
Zengin

-2

Ben max-age=0, must-revalidateve arasında bir fark olduğunu düşünüyorum no-cache:

In must-revalidatedurumda istemci göndermesine izin If-Modified-Sinceisteği ve eğer önbellekten yanıtı sunma 304 Not Modifieddöndürülür.

Bu no-cachedurumda, istemci yanıtı önbelleğe almamalı, bu nedenle kullanmamalıdır If-Modified-Since.


6
Ama no-cacheanlamına gelmez no-store- ile no-cachekaynak hala istemci önbelleğe alınabilir; kullanılmadan önce yeniden doğrulanması gerekir mi?
Aron

4
Sen kafa karıştırıyorsun no-cacheve no-store. no-cachekaynağın yeniden doğrulanması GEREKİR anlamına gelir . Revalidate gibi koşullu istekleri, kullanma seçeneği içerir If-None-Matchve If-Modified-Since.
Jules Sam. Randolph

1
@JulesRandolph: haklı olabilirsin. Herhangi bir test / tanıtımınız var mı? Bu q ile ilgili tüm çelişkili iddialar sinir bozucu. Kabul edilen cevap bile "En azından benim yorumum" der. Biraz zaman alırsam bir test yatağı kurabilir ve buraya gönderebilirim.
Zengin
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.