2013-01-24 21 views
28

Il mio problema è: a volte il browser sovrascrive alcune risorse anche se le ho già modificate. Ma dopo la F5, tutto va bene.Qual è il valore predefinito del controllo della cache?

Ho studiato questo caso per tutto il pomeriggio. Ora ho capito completamente il punto di "Ultima modifica" o "Cache-Control". E so come risolvere il mio problema (solo la versione .js? O max-age = xxxx). Ma il problema è ancora irrisolto: come fa il browser gestisce l'intestazione della risposta senza "Cache-Control" come questo:

Content-Length: 49675 
Content-Type: text/html 
Last-Modified: Thu, 27 Dec 2012 03:03:50 GMT 
Accept-Ranges: bytes 
Etag: "0af7fcbdee3cd1:972" 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Date: Thu, 24 Jan 2013 07:46:16 GMT 

Li cache di chiaramente quando "Inserire nella barra"

enter image description here

risposta

7

L'intestazione Cache-Control di default è: privato

Un meccanismo di cache può memorizzare questa pagina in una cache privata e inviarla nuovamente a un singolo client. Questo è il valore predefinito. La maggior parte dei server proxy non memorizza nella cache le pagine con questa impostazione.

Vedere http://msdn.microsoft.com/en-us/library/ms524721%28v=vs.90%29.aspx

+1

1) il motivo per cui i cant vedere Cache-Control : Privato nell'intestazione della risposta? 2) max-età =? – rhapsodyn

+5

Questo non risponde alla domanda.Ciò corrisponde a quello predefinito in IIS 6. – SilverlightFox

0

Senza l'intestazione di controllo della cache del browser richiede la risorsa ogni volta che si carica una nuova pagina (?). Colpendo F5 si invalida (o addirittura logicamente rimuove) qualsiasi elemento memorizzato nella pagina che forza il ricaricamento completo, poiché non è disponibile alcuna versione locale - non sono sicuro che il browser rimuova tali risorse dalla cache prima di richiederle di nuovo.

La parte divertente è che ci sono alcune impostazioni "aggiuntive" in alcuni browser che causano alcune ottimizzazioni come richiedere una risorsa solo una volta per caricamento della pagina. Se hai un'immagine che cambia per ogni richiesta come un contatore, vedrai solo una versione di questa immagine anche se la usi più volte.

Il prossimo è che il browser riutilizza le immagini che non sono impostate esplicitamente come nocache applicando una sorta di cache locale "preferita". Se si desidera avere una richiesta ogni volta che è necessario impostarla per riconvalidare e impostare scaduto a -1 o qualcosa del genere.

Quindi, a seconda della risorsa che specifica nulla, spesso si attivano alcuni valori di default che non sono gli stessi che ci si aspetterebbe dalla lettura delle specifiche.

Potrebbe anche esserci un comportamento diverso riguardo al fatto se la sorgente sembra essere locale, un'unità o un server Internet remoto. Detto questo, non tutti i browser funzionano in modo diverso e io sono piuttosto limitato.

Che cosa è utile per controllare www.google.com e cercare il pixel di tracciamento le loro richieste di pagina (due 1x1 pixel richiesti da metrics.gstats.com con parti casuali sul sottodominio).

Se si utilizza firebug per verificare l'intestazione, si vede che specificano le direttive nocache in qualsiasi modo possibile. L'intestazione si legge come questo:

Alternate-Protocol 443:quic 
Cache-Control no-cache, must-revalidate 
Content-Length 35 
Content-Type image/gif 
Date Mon, 25 Nov 2013 14:33:30 GMT 
Expires Fri, 01 Jan 1990 00:00:00 GMT 
Last-Modified Tue, 14 Aug 2012 10:47:46 GMT 
Pragma no-cache 
Server sffe 
X-Content-Type-Options nosniff 
X-Firefox-Spdy 3 
X-XSS-Protection 1; mode=block 

Prova questa come impostazione e verificare se questo risolve il problema che il browser non raccogliere le risorse modificate.La direttiva must-revalidate farà sì che anche le cache proxy possano richiedere una risorsa ogni volta e controllare 304 risposte non modificate.

Attualmente sperimento qualcosa di simile. Ho una connessione localhost che imposta l'etag e tutto ciò che accade è che la cache non chiede mai. Non ho impostato le informazioni di memorizzazione nella cache o simili. Solo specificando le giunture di tipo etag per far sì che FireFox non richieda nuovamente la risorsa. Quindi provo qualcosa di simile al tuo problema.

+0

no-cache implica già che deve essere nuovamente convalidato ogni volta. Pertanto, in questo caso è sufficiente solo no-cache – Klimashkin

+0

Per quanto riguarda "Senza l'intestazione di controllo della cache il browser richiede la risorsa ogni volta che carica una nuova (?) Pagina", che non sembra essere il caso di Google Chrome. Sembra memorizzare questi elementi indefinitamente. (Non sono sicuro degli altri browser.) – Sam

+0

'Colpendo F5 si annulla (o addirittura si rimuove logicamente) qualsiasi elemento memorizzato nella pagina che forza il ricaricamento completo." Non è giusto. Ciò farebbe sì che il browser verifichi le risorse aggiornate, non invalida la cache corrente. Alcuni browser possono farlo comunque quando viene premuta la combinazione ctrl f5. – SilverlightFox

13

RFC 7234 dettagli ciò che i browser e proxy dovrebbe fare in modo predefinito:

Anche se la cache è una caratteristica del tutto facoltativo di HTTP, si può per scontato che il riutilizzo di una risposta in cache è auspicabile e che tale riutilizzo è il comportamento predefinito quando nessun requisito o configurazione locale lo impedisce. Pertanto, i requisiti di cache HTTP sono focalizzata sulla prevenzione una cache sia da memorizzare una risposta non riutilizzabile o riutilizzare una risposta memorizzato impropriamente, anziché che impone che le cache memorizzano sempre e riutilizzare particolari risposte.

5

La memorizzazione nella cache di solito è abilitata di default nei brower, quindi è possibile utilizzare cache-control per personalizzare questo comportamento o disattivarlo.

Sebbene cache è una caratteristica del tutto facoltativa di HTTP, si può presumere che riutilizzando una risposta cache è desiderabile e che tale riutilizzo è il comportamento predefinito quando nessun requisito o configurazione locale impedisce. Pertanto, i requisiti della cache HTTP si concentrano sull'impedire che una cache memorizzi una risposta non riutilizzabile o riutilizzi una risposta memorizzata in modo inappropriato, piuttosto che imporre che le cache memorizzino sempre e riutilizzino le risposte specifiche. [https://tools.ietf.org/html/rfc7234#section-2]

La volta che il browser considera una risposta in cache fresco è di solito rispetto a quando è stato modificato l'ultima:

Dal server di origine non sempre forniscono tempi di scadenza esplicite, una cache può assegnare un'euristica tempo di scadenza, quando un tempo esplicito non è specificato, gli algoritmi che impiegano che utilizzano altri valori di campo di intestazione (come ad esempio l'ora dell'ultima modifica) ... Se la risposta ha un last-Modified campo di intestazione (sezione 2.2 di [RFC7232]), cache sono incoraggiati ad usare un valore di scadenza euristico che non è altro che una parte dell'intervallo da quel momento. Un'impostazione tipica di questa frazione potrebbe essere del 10%. [https://tools.ietf.org/html/rfc7234#section-4.2.2]

This post ha dettagli su come i diversi browser calcolano tale valore.

1

La durata freschezza viene calcolata sulla base di diverse intestazioni. Se viene specificata un'intestazione "Cache-control: max-age = N", la durata della freschezza è uguale a N. Se questa intestazione non è presente, che è molto spesso il caso, viene controllato se è presente un'intestazione Expires. Se esiste un'intestazione Expires, il suo valore meno il valore dell'intestazione Data determina la durata della freschezza. Infine, se non è presente nessuna intestazione, cerca un'intestazione Last-Modified. Se questa intestazione è presente, la freschezza della vita del cache è uguale al valore dell'intestazione Data meno il valore del Last-Modified diviso per 10.

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ

+0

La freschezza è solo un elemento della memorizzazione nella cache. Non vi è alcuna garanzia che questo sia il fattore che causa l'uso della cache. Come nota a margine, questo link può essere utilizzato senza internazionalizzazione per la versione inglese. –

+0

Nessuna regola dice che il file verrà memorizzato nella cache solo quando si imposta il controllo della cache o scade. Una risposta ricevuta con un codice di stato di 200, 203, 206, 300, 301 o 410 può essere memorizzata da una cache e utilizzata in risposta a una richiesta successiva, soggetta al meccanismo di scadenza, a meno che una direttiva di controllo della cache proibisca la memorizzazione nella cache. – kouut

Problemi correlati