2014-07-16 13 views
6

Sono ragionevolmente nuovo al caching del browser. Sto tentando di fare in modo che Chrome memorizzi in modo permanente qualsiasi file statico con un parametro di query (per scopi di busting della cache). Ho impostato le intestazioni di Cache-Control and Expires in modo futuro, il che dovrebbe essere adeguato per dire "cache per sempre". Le intestazioni di risposta liberati:Chrome si rifiuta di memorizzare nella cache Javascript

 
HTTP/1.1 200 OK 
Cache-Control: public, max-age=315360000 
Connection: keep-alive 
Content-Encoding: gzip 
Content-Type: application/x-javascript 
Date: Wed, 16 Jul 2014 09:29:54 GMT 
Last-Modified: Wed, 16 Jul 2014 03:44:14 GMT 
Server: nginx/1.6.0 
Transfer-Encoding: chunked 
Vary: Accept-Encoding 

Firefox e Safari sembrano rispettare questo per tutti i file cachebusted (v = parametri di query?). Chrome segue principalmente le direttive, ad eccezione di Javascript. La maggior parte delle volte esegue una richiesta con un'intestazione If-Modified-Since piuttosto che il caricamento dalla cache. A volte uno di essi verrà caricato dalla cache e l'altro produrrà una richiesta risultante in un 304. Di solito quando si carica la pagina da una nuova scheda verrà caricato dalla cache, ma non se si preme invio nella barra degli indirizzi.

Debugger

ho osservato altri siti web utilizzando quello che penso siano le stesse identiche intestazioni, ei file vengono sempre caricati dalla cache. Alcuni caricano dalla cache anche se si esegue un aggiornamento.

Capisco che il comportamento della cache è alquanto imprevedibile, ma voglio essere sicuro di non supervisionare qualcosa che sta facendo fare a Chrome ciò?

risposta

1

ho avuto lo stesso problema con cromo e dopo alcune ore di tentativi ed errori ho figuered fuori, che Chrome sembra avere un problema con il Vary Header

ho questo frammento nel mio Apache/.htaccess config e non appena ho commentare la linea "Intestazione append Vary Accept-Encoding" Chrome inizia js caching e file css

<FilesMatch "(\.js\.gz|\.css\.gz)$"> 
    # Serve correct encoding type. 
    Header set Content-Encoding gzip 
    # Force proxies to cache gzipped & non-gzipped css/js files separately. 
    #Header append Vary Accept-Encoding 
</FilesMatch> 

si continua a non funzionare durante l'esecuzione della richiesta tramite il nostro server nignx, perché è aggiungendo l'intestazione Vary: Accept-Encoding anche quando si consegna gzip compresso.

Finora posso indovinare questo è un problema che si verifica solo con chrome e come soluzione alternativa avrei modificato la configurazione per aggiungere l'intestazione solo se chrome (non controllato per safari) non è il client finché non c'è un migliore correzione:

<FilesMatch "(\.js\.gz|\.css\.gz)$"> 
    # Serve correct encoding type. 
    Header set Content-Encoding gzip 
    # Force proxies to cache gzipped & non-gzipped css/js files separately. 
    BrowserMatch "Chrome" ChromeFound 
    Header append Vary Accept-Encoding env=!ChromeFound 
</FilesMatch> 
Problemi correlati