IIS7 Önbellek Kontrolü


98

Oldukça basit olacağını düşündüğüm bir şey yapmaya çalışıyorum. IIS 7'yi, istemcilere sitemdeki tüm resimleri belirli bir süre, diyelim ki 24 saat önbelleğe alabileceklerini söyleyin.

Http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx üzerindeki adımı denedim, ancak boşuna. Hala 304'lerin iade edildiği sunucuya giden istekler alıyorum.

Bunu yapmanın bir yolu olan var mı? Grafiksel olarak yoğun bir sitem var ve kullanıcılarım bir sayfa talep ettikleri her seferinde (benim sunucum da) saldırıya uğruyor. Garip bir şekilde resimler Firebug'da "Cache-Control private, max-age = 3600" gösteriyor gibi görünüyor, ancak tarayıcı F5'e bastığımda hala onları istiyor.

Yanıtlar:


128

Cache-Control başlığını ayarlamak istiyorsanız, ne yazık ki IIS7 kullanıcı arayüzünde bunu yapacak hiçbir şey yok.

Ancak bu web.config dosyasını, ayarlamak istediğiniz klasörün veya sitenin köküne bırakabilirsiniz:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

Bu, istemciye bu klasördeki ve tüm alt klasörlerdeki içeriği 7 gün boyunca önbelleğe alması için bilgi verecektir.

Bunu appcmd.exe, aşağıdaki gibi IIS7 metatabanını düzenleyerek de yapabilirsiniz :

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  set config "Varsayılan Web Sitesi / klasör" 
  -bölüm: system.webServer / staticContent 
  -clientCache.cacheControlMode: UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  set config "Varsayılan Web Sitesi / klasör" 
  -bölüm: system.webServer / staticContent 
  -clientCache.cacheControlMaxAge: "7.00: 00: 00"

5
StaticContent yapılandırma öğesi için MSDN belgeleri şurada bulunabilir: msdn.microsoft.com/en-us/library/ms689443.aspx
Milan Gardian

4
Aşağıdaki 360Airwalk gönderilerine bakın, IIS7
ChadT

Bir bilgi olarak: bu ayarın yerleşik Geliştirme Sunucusu (en azından VS 2010 SP1'in) üzerinde hiçbir etkisi yok gibi görünüyor. Neden çalışmadığından şüpheniz varsa, IIS'ye danışın.

6
Merhaba Jeff, farklı mime türleri veya dosya uzantıları için farklı Cache-Control( max-age) başlıkların nasıl sunulacağının farkında mısın?
Jasper

@Jeff Atwood Belki bana yardım edebilirsin. Şuna bakın: stackoverflow.com/questions/57990579/…
Success Man

116

Bu doğru değil Jeff.

IIS 7 Yönetici Kullanıcı Arayüzünüzde bir klasör seçmeniz (örneğin Görüntüler veya Varsayılan Web Uygulaması klasöründe olay) ve ardından "HTTP Yanıt Başlıkları" na tıklamanız yeterlidir. Daha sonra sağ bölmedeki "Ortak Başlığı Ayarla .." seçeneğini tıklamanız ve "Web içeriğini Sona Erdir" seçeneğini seçmeniz gerekir. Orada, "Sonra:" yı seçerek, Metin kutusuna "24" girerek ve birleşik giriş kutusunda "Saatler" i seçerek maksimum 24 saatlik bir yaşı kolayca yapılandırabilirsiniz.

Web.config girişi ile ilgili ilk paragrafınız doğrudur. Önbellek kontrol başlığını "genel" olarak ayarlamak için cacheControlCustom özniteliğini veya bu durumda ne gerekiyorsa eklerdim.

Elbette, gerektiğinde web.config girişlerini (veya dosyalarını) sağlayarak aynısını başarabilirsiniz.

Düzenleme: kafa karıştırıcı bir cümle kaldırıldı :)


1
Bu ayarın kullanıcı arayüzü korkunç. Ama oraya nasıl gideceğinizi açıkladığınız için teşekkürler! +1
Billy Coover

Bu arabirim, Jeff'in yayınladığı yapılandırmanın aynısına sahip bir web.config oluşturur. Bilmek iyi oldu! Teşekkürler!
RandyMorris

2
@ 360Airwalk gönderisi için teşekkürler. Farklı mime türleri veya dosya uzantıları için farklı Cache-Control( max-age) başlıkların nasıl sunulacağının farkında mısınız ?
Jasper

3
@Jasper: Örneğin klasör başına ayarlayabilirsiniz. Bir klasörde önbellek denetimini ayarlarsanız, alt klasörler bu ayarı devralır, ancak yeniden geçersiz kılabilirsiniz ve bu böyle devam eder. bunu dosya başına bazında bile yapabilirsiniz. iis konsoluna erişemiyorsanız, bunu web.config aracılığıyla da yapabilirsiniz. ikinci stackoverflow.com/questions/2195266/…
gönderiye

28

Bunu kullanıyorum

<staticContent>
<clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="500.00:00:00" />
</staticContent>

statik içeriği 500 gün boyunca genel önbellek kontrol başlığı ile önbelleğe almak için.


10
Önerilen uygulama 1 yıl, temelde 365 gündür.
Anicho

5
500 gün KÖTÜ, makalelerin önbelleği 1 yıldan daha uzun süreye ayarlamamanızı söyleyen bir RFC kuralı hakkında konuşması developer.google.com/speed/docs/best-practices/caching Gelecekte bir yıldan daha uzun bir süreye ayarlamayın , çünkü bu RFC kurallarını ihlal ediyor.
foxontherock

@foxontherock, 365 günden fazla süren RFC kuralının kötü bir uygulama olduğunu kanıtlayabileceğiniz herhangi bir şekilde? Belgelerde bunu önerecek hiçbir şey bulamıyorum ...
Paesano2000

@Elmer Belki bana yardım edebilirsin. Şuna bakın: stackoverflow.com/questions/57990579/…
Success Man

19

F5 Yenileme, "lütfen mevcut HTML'yi VE doğrudan bağımlılıklarını yeniden yükleyin " anlamına sahiptir. Bu nedenle, HTML tarafından doğrudan referans verilen imgs, css ve js kaynaklarının da yeniden yapılandırıldığını görmeyi beklemelisiniz. Elbette 304 buna kabul edilebilir bir yanıttır, ancak F5 yenilemesi tarayıcının yeni önbellek içeriğine güvenmek yerine istekte bulunacağını ima eder.

Bunun yerine, başka bir yere gitmeyi ve sonra geri dönmeyi deneyin.

Çoğu tarayıcıda f5'e basarken ctrl tuşunu basılı tutarak yenilemeyi 304'ü geçmeye zorlayabilirsiniz.


18

Düzenlemem geri alındığı için Elmer'in cevabını tamamlıyoruz.

Statik içeriği 365 gün boyunca genel önbellek kontrol başlığıyla önbelleğe almak için , IIS aşağıdaki şekilde yapılandırılabilir

<staticContent>
    <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
</staticContent>

Bu, aşağıdaki gibi bir başlığa dönüşecektir:

Cache-Control: public,max-age=31536000

Maksimum yaşın saniye cinsinden bir delta olduğunu ve RFC 2616 Bölüm 14.9.3 ve 14.9.4'te belirtildiği gibi pozitif 32 bitlik bir tamsayı ile ifade edildiğini unutmayın . Bu, maksimum 2 ^ 31 veya 2.147.483.648 saniye (68 yıldan fazla) değerini temsil eder. Ancak, istemciler ve sunucular arasında uyumluluğu daha iyi sağlamak için önerilen maksimum 365 gün (bir yıl) kabul ediyoruz.

Diğer yanıtlarda da belirtildiği gibi, bu yönergeleri tüm statik içerik için sitenizin web.config dosyasında da kullanabilirsiniz. Alternatif olarak, bunu yalnızca belirli bir konumdaki içerikler için de kullanabilirsiniz (örnekte, "cdn" klasöründeki içerikler için 30 günlük genel önbellek):

<location path="cdn">
   <system.webServer>
        <staticContent>
             <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/>
        </staticContent>
   </system.webServer>
</location>

Luciano, senin yöntemini kullanarak resimlerimi önbelleğe almaya çalışıyorum. Şimdi HttpFox kullanarak analiz ettiğimde her görüntü için 2 istek yapıldığını görüyorum. 1. Birincisi (NS_BINDING_ABORTED) hatasıyla iptal edilmiş bir sonuç verir. 2. ikinci istek önbelleğe alınmış bir görüntüdür. Düşüncesi olan var mı?
Mithil

1

kolay bir yol vardır: 1. web sitesinin web.config 2. "staticContent" bölümünde kullanarak belirli fileExtension öğesini kaldırın ve mimeMap ekleyin 3. "clientCache" ekleyin

<configuration>
  <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    <staticContent>
      <remove fileExtension=".ipa" />
      <remove fileExtension=".apk" />
      <mimeMap fileExtension=".ipa" mimeType="application/iphone" />
      <mimeMap fileExtension=".apk" mimeType="application/vnd.android.package-archive" />
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="777.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>
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.