Kontrol-Cache IIS7

95

Saya mencoba melakukan sesuatu yang menurut saya cukup sederhana. Dapatkan IIS 7 untuk memberi tahu klien bahwa mereka dapat menyimpan semua gambar di situs saya untuk jangka waktu tertentu, katakanlah 24 jam.

Saya telah mencoba langkah di http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx tetapi tidak berhasil. Saya masih mendapatkan permintaan ke server dengan 304s dikembalikan.

Apakah ada yang punya cara untuk melakukan ini? Saya memiliki situs yang intensif secara grafis dan pengguna saya dipukul (begitu juga server saya) setiap kali mereka meminta halaman. Anehnya, gambar tersebut tampaknya memiliki "Cache-Control private, max-age = 3600" muncul di Firebug tetapi browser masih memintanya saat saya menekan F5.

Chris Meek
sumber

Jawaban:

124

Jika Anda ingin menyetel header Cache-Control, sayangnya tidak ada di UI IIS7 untuk melakukan ini.

Namun Anda dapat meletakkan web.config ini di root folder atau situs tempat Anda ingin mengaturnya:

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

Itu akan memberi tahu klien untuk menyimpan konten selama 7 hari di folder itu dan semua subfolder.

Anda juga dapat melakukan ini dengan mengedit metabase IIS7 melalui appcmd.exe, seperti:

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  setel config "Situs / folder Web Default" 
  -bagian: system.webServer / staticContent 
  -clientCache.cacheControlMode: UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  setel config "Situs / folder Web Default" 
  -bagian: system.webServer / staticContent 
  -clientCache.cacheControlMaxAge: "7.00: 00: 00"
Jeff Atwood
sumber
5
Dokumentasi MSDN untuk elemen konfigurasi staticContent dapat ditemukan di sini: msdn.microsoft.com/en-us/library/ms689443.aspx
Milan Gardian
4
Lihat 360Airwalk posting di bawah ini, ada UI untuk ini di IIS7
ChadT
Sekadar info: pengaturan ini tampaknya tidak berpengaruh pada Server Pengembangan bawaan (setidaknya dari VS 2010 SP1). Jika ragu mengapa tidak berhasil, periksa dengan IIS.
6
Hai Jeff, apakah Anda mengetahui cara menyajikan header Cache-Control( max-age) yang berbeda untuk jenis mime atau ekstensi file yang berbeda?
Jasper
@Jeff Atwood Mungkin Anda bisa membantu saya. Lihat ini: stackoverflow.com/questions/57990579/…
Success Man
116

Itu tidak benar Jeff.

Anda hanya perlu memilih folder dalam IIS 7 Manager UI Anda (mis. Gambar atau folder Aplikasi Web Default) dan kemudian klik "HTTP Response Headers". Kemudian Anda harus mengklik "Set Common Header .." di panel kanan dan pilih "Expire Web content". Di sana Anda dapat dengan mudah mengkonfigurasi usia maksimal 24 jam dengan memilih "Setelah:", memasukkan "24" di Kotak Teks dan memilih "Jam" di kotak kombo.

Paragraf pertama Anda tentang entri web.config benar. Saya akan menambahkan atribut cacheControlCustom untuk menyetel header kontrol cache ke "publik" atau apa pun yang diperlukan dalam kasus itu.

Anda bisa, tentu saja, mencapai hal yang sama dengan menyediakan entri web.config (atau file) sesuai kebutuhan.

Edit: hapus kalimat yang membingungkan :)

360Airwalk
sumber
1
UI untuk pengaturan ini buruk. Tapi terima kasih telah menjelaskan bagaimana menuju ke sana! +1
Billy Coover
Antarmuka ini membuat web.config dengan konfigurasi yang sama seperti yang diposting Jeff. Bagus untuk mengetahui! Terima kasih!
RandyMorris
2
Terima kasih atas kiriman @ 360Airwalk. Apakah Anda mengetahui cara menyajikan header Cache-Control( max-age) yang berbeda untuk jenis mime atau ekstensi file yang berbeda?
Jasper
3
@Jasper: Anda dapat mengaturnya per folder misalnya. jika Anda mengatur kontrol-cache pada subfolder folder akan mewarisi pengaturan tetapi Anda dapat menimpanya lagi dan seterusnya. Anda bahkan dapat melakukannya dengan basis per file. jika Anda tidak dapat mengakses konsol iis, Anda dapat melakukannya melalui web.config juga. lihat posting ini untuk stackoverflow.com/questions/2195266/…
360Airwalk
27

Saya menggunakan ini

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

untuk menyimpan konten statis selama 500 hari dengan header kontrol-cache publik.

Elmer
sumber
10
Praktik yang disarankan adalah 1 tahun pada dasarnya 365 hari tidak lebih.
Anicho
5
500 hari BURUK, artikel tersebut membahas tentang aturan RFC yang memerintahkan untuk tidak menyetel tembolok ke lebih dari 1 tahun developers.google.com/speed/docs/best-practices/caching Jangan setel ke lebih dari satu tahun di masa mendatang , karena melanggar pedoman RFC.
foxontherock
@foxontherock dengan cara apa pun Anda dapat mendukung aturan RFC lebih dari 365 hari sebagai praktik yang buruk? Saya tidak dapat menemukan apa pun yang menyarankan hal ini dalam dokumentasi ...
Paesano2000
@Elmer Mungkin Anda bisa membantu saya. Lihat ini: stackoverflow.com/questions/57990579/…
Success Man
19

Refresh F5 memiliki semantik "harap muat ulang HTML saat ini DAN ketergantungan langsungnya". Oleh karena itu, Anda akan melihat sumber daya imgs, css dan js yang secara langsung direferensikan oleh HTML juga sedang diambil ulang. Tentu saja 304 adalah respons yang dapat diterima untuk ini tetapi penyegaran F5 menyiratkan bahwa browser akan membuat permintaan daripada mengandalkan konten cache baru.

Alih-alih, cobalah menavigasi ke tempat lain dan kemudian menavigasi kembali.

Anda dapat memaksa refresh, melewati 304, dengan menahan ctrl sambil menekan f5 di kebanyakan browser.

AnthonyWJones
sumber
18

Melengkapi jawaban Elmer, saat suntingan saya dibatalkan.

Untuk menyimpan konten statis selama 365 hari dengan header kontrol cache publik , IIS dapat dikonfigurasi dengan yang berikut ini

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

Ini akan diterjemahkan menjadi tajuk seperti ini:

Cache-Control: public,max-age=31536000

Perhatikan bahwa usia maksimal adalah delta dalam hitungan detik, yang dinyatakan dengan bilangan bulat 32-bit positif seperti yang dinyatakan dalam RFC 2616 Bagian 14.9.3 dan 14.9.4 . Ini mewakili nilai maksimum 2 ^ 31 atau 2.147.483.648 detik (lebih dari 68 tahun). Namun, untuk lebih memastikan kompatibilitas antara klien dan server, kami mengadopsi maksimum yang disarankan 365 hari (satu tahun).

Seperti yang disebutkan pada jawaban lain, Anda dapat menggunakan arahan ini juga di web.config situs Anda untuk semua konten statis. Sebagai alternatif, Anda juga dapat menggunakannya hanya untuk konten di lokasi tertentu (pada contoh, cache publik 30 hari untuk konten di folder "cdn"):

<location path="cdn">
   <system.webServer>
        <staticContent>
             <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/>
        </staticContent>
   </system.webServer>
</location>
Luciano Carvalho
sumber
Luciano, saya mencoba menyimpan gambar saya menggunakan metode Anda. Sekarang ketika saya menganalisis menggunakan HttpFox saya melihat 2 permintaan dibuat untuk setiap gambar. 1. Yang pertama memberikan hasil yang dibatalkan dengan kesalahan (NS_BINDING_ABORTED) 2. permintaan kedua adalah gambar yang di-cache. Ada pemikiran?
Mithil
1

ada cara mudah: 1. menggunakan web.config situs web 2. di bagian "staticContent" hapus fileExtension tertentu dan tambahkan mimeMap 3. tambahkan "clientCache"

<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>
pengguna1401317
sumber