Come impedire la memorizzazione nella cache in Internet Explorer

Avviso

L'applicazione desktop Internet Explorer 11, ritirata e fuori supporto, è stata disabilitata in modo permanente tramite un aggiornamento di Microsoft Edge su alcune versioni di Windows 10. Per altre informazioni, vedere Domande frequenti sul ritiro delle app desktop di Internet Explorer 11.

Questo articolo descrive l'uso di intestazioni HTTP per controllare la memorizzazione nella cache delle pagine Web in Internet Explorer.

Versione originale del prodotto: Internet Explorer
Numero KB originale: 234067

Riepilogo

È possibile usare Microsoft Internet Information Server (IIS) per contrassegnare facilmente pagine altamente volatili o sensibili usando lo script seguente all'inizio estremo delle pagine ASP (Active Server Pages) specifiche:

<% Response.CacheControl = "no-cache" %>
<% Response.AddHeader "Pragma", "no-cache" %>
<% Response.Expires = -1 %>

Scadenza e intestazione Expires

È consigliabile che tutti i server Web usno uno schema per la scadenza di tutte le pagine Web. Non è consigliabile che un server Web non fornisca informazioni sulla scadenza tramite l'intestazione di risposta Http Expires per ogni risorsa restituita ai client richiesti. La maggior parte dei browser e dei proxy intermedi oggi rispetta queste informazioni di scadenza e le usa per aumentare l'efficienza delle comunicazioni in rete.

Usare sempre l'intestazione Expires per specificare il tempo più ragionevole in cui un determinato file nel server deve essere aggiornato dal client. Quando le pagine vengono aggiornate regolarmente, il periodo successivo per l'aggiornamento è la risposta più efficiente. Si prenda, ad esempio, una pagina di notizie giornaliera su Internet che viene aggiornata ogni giorno alle 5 del mattino. Il server Web per questa pagina di notizie deve restituire un'intestazione Expires con un valore per le 5 del mattino del giorno successivo. Al termine, il browser non deve contattare di nuovo il server Web fino a quando la pagina non viene modificata.

Le pagine che non devono essere modificate devono essere contrassegnate con una data di scadenza di circa un anno.

In molti casi, i server Web hanno una o più pagine volatili in un server che contengono informazioni soggette a modifiche immediate. Queste pagine devono essere contrassegnate dal server con il valore "-1" per l'intestazione Expires. In caso di richieste future da parte dell'utente, Internet Explorer in genere contatta il server Web per gli aggiornamenti a tale pagina tramite una richiesta condizionale If-Modified-Since. Tuttavia, la pagina rimane nella cache del disco (file Internet temporanei). E la pagina viene usata in situazioni appropriate senza contattare il server Web remoto, ad esempio:

  • quando i pulsanti BACK e FORWARD vengono usati per accedere alla cronologia di spostamento.
  • quando il browser è in modalità offline.

Intestazione Cache-Control

Alcune pagine, tuttavia, sono così volatili o sensibili che non richiedono memorizzazione nella cache del disco. A tale scopo, Internet Explorer supporta l'intestazione http 1.1 Cache-Control. Questa intestazione impedisce la memorizzazione nella cache di una determinata risorsa Web quando il valore no-cache viene specificato da un server HTTP 1.1.

Le pagine che vengono mantenute fuori dalla cache non sono accessibili fino a quando il browser non può ricontattare il server Web. Pertanto, i server devono usare l'intestazione Cache-Control con parsimonia. Nella maggior parte dei casi, è preferibile usare Expires: -1.

Intestazione Pragma: No-Cache

Sfortunatamente, i server HTTP 1.0 legacy non possono usare l'intestazione Cache-Control. Ai fini della compatibilità con le versioni precedenti dei server HTTP 1.0, Internet Explorer supporta un utilizzo speciale dell'intestazione Pragma HTTP: no-cache. Se il client comunica con il server tramite una connessione protetta (https://) e il server restituisce un'intestazione Pragma: no-cache con la risposta, Internet Explorer non memorizza nella cache la risposta.

Tuttavia, l'intestazione Pragma: no-cache non era a questo scopo. In base alle specifiche HTTP 1.0 e 1.1, questa intestazione è definita solo nel contesto di una richiesta, non in una risposta. È destinato ai server proxy che potrebbero impedire a determinate richieste importanti di raggiungere il server Web di destinazione. Per le applicazioni future, l'intestazione Cache-Control è il mezzo appropriato per controllare la memorizzazione nella cache.

TAG META HTTP-EQUIV

Le pagine HTML consentono una forma HTTP-EQUIV speciale del tag META che specifica intestazioni HTTP specifiche dall'interno del documento HTML. Ecco una breve pagina HTML di esempio che usa sia Pragma: no-cache che Expires: -1:

<HTML>
    <HEAD>
        <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
        <META HTTP-EQUIV="Expires" CONTENT="-1">
    </HEAD>
<BODY>
</BODY>
</HTML>

Pragma: no-cache impedisce la memorizzazione nella cache solo se usata su una connessione sicura. Un tag Pragma: META senza cache viene trattato in modo identico a Scade: -1 se usato in una pagina non sicura. La pagina verrà memorizzata nella cache ma contrassegnata come immediatamente scaduta.

Cache-Control tag META HTTP-EQUIV vengono ignorati e non hanno alcun effetto in Internet Explorer versione 4 o 5. Per usare Cache-Control, questa intestazione deve essere specificata usando intestazioni HTTP come descritto nella sezione Cache-Control precedente.

Nota

L'uso di intestazioni HTTP standard è molto preferito rispetto ai tag META. I tag META devono in genere essere visualizzati nella parte superiore della sezione HTML HEAD. Esiste anche almeno un problema noto con il tag PRAGMA HTTP-EQUIV META.

Opzioni del server per la memorizzazione nella cache

Quando l'intestazione Cache-Control deve essere usata in pagine non ASP, potrebbe essere necessario usare le opzioni nella configurazione del server per aggiungere automaticamente questa intestazione. Per il processo di aggiunta di intestazioni HTTP alle risposte del server per una determinata directory, fare riferimento al documento del server. Ad esempio, in IIS 4 seguire questa procedura:

  1. Avviare Gestione IIS.
  2. Nell'albero del computer e dei servizi aprire il server Web predefinito o il server Web in questione. Trovare la directory contenente il contenuto che richiede l'intestazione Cache-Control.
  3. Aprire la finestra di dialogo Proprietà per tale directory.
  4. Selezionare la scheda Intestazioni HTTP .
  5. Selezionare il pulsante Aggiungi nel gruppo Intestazioni HTTP personalizzate e aggiungere Cache-Control per il nome dell'intestazione e nessuna cache per il valore dell'intestazione.

Non è consigliabile usare questa intestazione a livello globale nell'intero server Web. Limita il suo uso esclusivamente a contenuto che assolutamente non deve essere memorizzato nella cache nel client.

Elenco di controllo dei problemi

Se sono state applicate le tecniche in questo articolo e si verificano ancora problemi con la memorizzazione nella cache e Internet Explorer, esaminare questo pratico elenco di controllo passo dopo passo prima di contattare Microsoft per assistenza tecnica:

  • Si usa l'intestazione Cache-Control con la proprietà ASP Response.CacheControl o tramite un'intestazione HTTP restituita? È l'unico modo per impedire realmente la memorizzazione nella cache in Internet Explorer.
  • Si usa Internet Explorer 4.01 Service Pack 2 o versione successiva? Non è possibile impedire completamente la memorizzazione nella cache nelle versioni precedenti del browser.
  • È stato verificato che il server Web abbia attivato HTTP 1.1 e che stia restituendo risposte HTTP 1.1 a Internet Explorer? Cache-Control intestazioni non sono valide nelle risposte HTTP 1.0.
  • Se si usa CGI/ISAPI/Servlets sul lato server, si sta seguendo esattamente la specifica HTTP 1.1, in particolare per quanto riguarda la terminazione CRLF delle intestazioni HTTP? Nell'interesse delle prestazioni, Internet Explorer in genere non perdona le risposte che violano la specifica HTTP 1.1. In genere genera intestazioni ignorate o report di errori imprevisti del server.
  • Le intestazioni HTTP vengono digitate correttamente?

Vedere anche