IIS7 Cache-Control


95

Sto cercando di fare qualcosa che pensavo fosse abbastanza semplice. Ottieni IIS 7 per dire ai clienti che possono memorizzare nella cache tutte le immagini sul mio sito per un certo periodo di tempo, diciamo 24 ore.

Ho provato il passaggio su http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx ma senza alcun risultato. Ricevo ancora richieste al server con la restituzione dei 304.

Qualcuno ha un modo per farlo? Ho un sito graficamente intenso e i miei utenti vengono martellati (così come il mio server) ogni volta che richiedono una pagina. Stranamente le immagini sembrano avere "Cache-Control private, max-age = 3600" visualizzato in Firebug ma il browser le richiede ancora quando premo F5.

Risposte:


124

Se vuoi impostare l'intestazione Cache-Control, non c'è niente nell'interfaccia utente di IIS7 per farlo, purtroppo.

È tuttavia possibile rilasciare questo web.config nella radice della cartella o del sito in cui si desidera impostarlo:

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

Ciò informerà il client di memorizzare nella cache il contenuto per 7 giorni in quella cartella e in tutte le sottocartelle.

Puoi anche farlo modificando la metabase IIS7 tramite appcmd.exe, in questo modo:

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  imposta la configurazione "Sito Web predefinito / cartella" 
  -sezione: system.webServer / staticContent 
  -clientCache.cacheControlMode: UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  imposta la configurazione "Sito Web predefinito / cartella" 
  -sezione: system.webServer / staticContent 
  -clientCache.cacheControlMaxAge: "7.00: 00: 00"

5
La documentazione MSDN per l'elemento di configurazione staticContent può essere trovata qui: msdn.microsoft.com/en-us/library/ms689443.aspx
Milan Gardian

4
Vedi i post 360Airwalk di seguito, c'è un'interfaccia utente per questo in IIS7
ChadT

A titolo informativo: questa impostazione sembra non avere alcun effetto sul server di sviluppo integrato (almeno di VS 2010 SP1). In caso di dubbi sul motivo per cui non funziona, verificare con IIS.

6
Ciao Jeff, sai come servire intestazioni Cache-Control( max-age) differenti per diversi tipi MIME o estensioni di file?
Jasper

@ Jeff Atwood Forse puoi aiutarmi. Guarda questo: stackoverflow.com/questions/57990579/…
Success Man

115

Non è vero Jeff.

Devi semplicemente selezionare una cartella all'interno della tua IIS 7 Manager UI (ad es. Immagini o evento la cartella dell'applicazione Web predefinita) e quindi fare clic su "Intestazioni risposta HTTP". Quindi devi fare clic su "Imposta intestazione comune .." nel riquadro di destra e selezionare "Scadenza contenuto Web". Qui puoi facilmente configurare un'età massima di 24 ore scegliendo "Dopo:", inserendo "24" nella casella di testo e scegli "Ore" nella casella combinata.

Il tuo primo paragrafo relativo alla voce web.config è corretto. Aggiungerei l'attributo cacheControlCustom per impostare l'intestazione del controllo della cache su "public" o qualsiasi altra cosa sia necessaria in quel caso.

Ovviamente puoi ottenere lo stesso risultato fornendo voci (o file) web.config secondo necessità.

Modifica: rimossa una frase confusa :)


1
L'interfaccia utente per questa impostazione è terribile. Ma grazie per aver spiegato come arrivarci! +1
Billy Coover

Questa interfaccia crea un web.config con la stessa configurazione di Jeff pubblicato. Bello sapere! Grazie!
RandyMorris

2
Grazie per il post @ 360Airwalk. Sapete come servire differenti intestazioni Cache-Control( max-age) per differenti tipi MIME o estensioni di file?
Jasper

3
@ Jasper: puoi impostarlo per cartella, ad esempio. se imposti il ​​controllo della cache su una cartella, le sottocartelle erediteranno l'impostazione ma puoi sovrascriverlo di nuovo e così via. puoi anche farlo in base ai file. se non puoi accedere alla console iis puoi farlo anche tramite web.config. vedere questo post per questi ultimi stackoverflow.com/questions/2195266/...
360Airwalk

27

Io uso questo

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

memorizzare nella cache il contenuto statico per 500 giorni con un'intestazione di controllo della cache pubblica.


10
La pratica consigliata è di 1 anno essenzialmente 365 giorni non di più.
Anicho

5
500 giorni è MALE, che gli articoli parlano di una regola RFC che dice di non impostare la cache su più di 1 anno developers.google.com/speed/docs/best-practices/caching Non impostarla su più di un anno in futuro , in quanto ciò viola le linee guida RFC.
foxontherock

@foxontherock in qualche modo potresti confermare che la regola RFC di oltre 365 giorni è una cattiva pratica? Non riesco a trovare nulla che lo suggerisca nella documentazione ...
Paesano2000

@Elmer Forse puoi aiutarmi. Guarda questo: stackoverflow.com/questions/57990579/…
Success Man

19

L'aggiornamento F5 ha la semantica di "ricaricare l'HTML corrente E le sue dipendenze dirette". Quindi dovresti aspettarti di vedere qualsiasi risorsa imgs, css e js direttamente referenziata dall'HTML anche essere recuperata. Ovviamente un 304 è una risposta accettabile a questo, ma l'aggiornamento F5 implica che il browser effettuerà la richiesta piuttosto che fare affidamento sul nuovo contenuto della cache.

Invece prova semplicemente a navigare da qualche altra parte e poi a tornare indietro.

Puoi forzare l'aggiornamento, oltre 304, tenendo premuto ctrl mentre premi f5 nella maggior parte dei browser.


18

A complemento della risposta di Elmer, poiché la mia modifica è stata annullata.

Per memorizzare nella cache il contenuto statico per 365 giorni con l'intestazione di controllo della cache pubblica , IIS può essere configurato con quanto segue

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

Questo si tradurrà in un'intestazione come questa:

Cache-Control: public,max-age=31536000

Si noti che max-age è un delta in secondi, espresso da un numero intero positivo a 32 bit come indicato nelle sezioni RFC 2616 14.9.3 e 14.9.4 . Ciò rappresenta un valore massimo di 2 ^ 31 o 2.147.483.648 secondi (oltre 68 anni). Tuttavia, per garantire una migliore compatibilità tra client e server, adottiamo un massimo consigliato di 365 giorni (un anno).

Come accennato in altre risposte, puoi utilizzare queste direttive anche sul web.config del tuo sito per tutti i contenuti statici. In alternativa, puoi usarlo solo per i contenuti in una posizione specifica ( nell'esempio , 30 giorni di cache pubblica per i contenuti nella cartella "cdn"):

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

Luciano, sto cercando di memorizzare nella cache le mie immagini usando il tuo metodo. Adesso quando analizzo usando HttpFox vedo 2 richieste fatte per ogni immagine. 1. La prima fornisce un risultato interrotto con errore (NS_BINDING_ABORTED) 2. La seconda richiesta è un'immagine memorizzata nella cache. qualche idea?
Mithil

1

c'è un modo semplice: 1. usando web.config del sito web 2. nella sezione "staticContent" rimuovi fileExtension specifico e aggiungi mimeMap 3. aggiungi "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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.