2009-03-13 8 views
81

Sto provando a fare qualcosa che pensavo sarebbe stato abbastanza semplice. Ottieni IIS 7 per dire ai clienti che possono mettere in cache tutte le immagini sul mio sito per un certo periodo di tempo, diciamo 24 ore.IIS7 Cache-Control

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 successo. Ricevo ancora richieste al server con 304s restituiti.

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. Le immagini sembrano avere "Cache-Control private, max-age = 3600" in Firebug ma il browser le sta ancora chiedendo quando preme F5.

risposta

100

Se si desidera impostare l'intestazione Cache-Control, non c'è nulla nell'interfaccia utente IIS7 per fare ciò, purtroppo.

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

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

che informerà il cliente al contenuto della cache per 7 giorni in quella cartella e tutti sottocartelle.

si può anche fare questo modificando il metabase IIS7 via appcmd.exe, in questo modo:

 
\Windows\system32\inetsrv\appcmd.exe 
    set config "Default Web Site/folder" 
    -section:system.webServer/staticContent 
    -clientCache.cacheControlMode:UseMaxAge 

\Windows\system32\inetsrv\appcmd.exe 
    set config "Default Web Site/folder" 
    -section:system.webServer/staticContent 
    -clientCache.cacheControlMaxAge:"7.00:00:00" 
+5

La documentazione MSDN per l'elemento di configurazione staticContent è disponibile qui: http://msdn.microsoft.com/en-us/library/ms689443.aspx –

+4

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

+0

Proprio come un'informazione : questa impostazione sembra non avere alcun effetto sul server di sviluppo integrato (di VS 2010 SP1 almeno). In caso di dubbi sul perché non funziona, verificare con IIS. –

19

F5 Refresh ha la semantica di "ricarica l'attuale HTML E le sue dipendenze dirette". Quindi dovresti aspettarti di vedere qualsiasi risorsa imgs, css e js a cui fa riferimento il codice HTML, anch'esso recuperato. Naturalmente 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 provare semplicemente a navigare altrove e quindi tornare indietro.

È possibile forzare l'aggiornamento, oltre un 304, tenendo premuto ctrl mentre si preme f5 nella maggior parte dei browser.

+2

Vuoi dire Ctrl + F5 giusto! – Anicho

106

che non è vero Jeff.

È sufficiente selezionare una cartella nell'interfaccia utente di IIS 7 Manager (ad esempio immagini o eventi nella cartella Applicazione Web predefinita) e quindi fare clic su "Intestazioni di risposta HTTP". Quindi fai clic su "Imposta intestazione comune .." nel riquadro di destra e seleziona "Scadenza contenuto Web". Qui puoi configurare facilmente un massimo di 24 ore scegliendo "Dopo:", inserendo "24" nella casella di testo e scegliendo "Ore" nella casella combinata.

Il tuo primo paragrafo riguardante la voce web.config è corretto. Aggiungerei l'attributo cacheControlCustom per impostare l'intestazione del controllo della cache su "public" o su ciò che è necessario in quel caso.

È possibile, ovviamente, ottenere lo stesso fornendo voci (o file) di web.config, se necessario.

Edit: rimosso una frase confusa :)

+1

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

+0

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

+2

Grazie per il post @ 360Airwalk. Sei a conoscenza di come utilizzare diverse intestazioni 'Cache-Control' (' max-age') per diversi tipi di mime o estensioni di file? – Jasper

21

Io uso questo

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

di memorizzare nella cache il contenuto statico per 500 giorni con l'intestazione Cache-Control pubblico.

+9

Lo studio consigliato è di 1 anno essenzialmente 365 giorni non piu. – Anicho

+5

500 giorni è male, che gli articoli parla di una regola di RFC dicendo di non impostare la cache a più di 1 anno https://developers.google.com/speed/docs/best-practices/caching Non impostare a più di un anno nel futuro, in quanto viola le linee guida RFC. – foxontherock

16

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

contenuto di cache statico per 365 giorni con intestazione cache-controllo pubblico, IIS può essere configurato con la seguente

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

Questo si traduce in un'intestazione simile:

Cache-Control: public,max-age=31536000 

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

Come menzionato in altre risposte, è possibile utilizzare queste direttive anche sul web.config del proprio sito per tutti i contenuti statici. In alternativa, è possibile utilizzarlo solo per contenuti in una posizione specifica troppo (sul campione, 30 giorni di cache pubblico 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> 
+0

Luciano, Sto cercando di memorizzare nella cache le mie immagini usando il tuo metodo. Ora quando analizzo usando HttpFox vedo 2 richieste fatte per ogni immagine. 1. Il primo dà un risultato interrotto con l'errore (NS_BINDING_ABORTED) 2. la seconda richiesta è un'immagine memorizzata nella cache. Qualche idea? – Mithil

-1

c'è un modo semplice: 1. utilizzando web.config del sito 2. nella sezione "staticContent" rimuovere FileExtension specifico e aggiungere MimeMap 3. add "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>