2009-06-25 14 views
19

Ho una situazione in cui il mio server web (incorporato) sta inviando l'header Expires, ma il browser non sembra rispettare l'impostazione dell'intestazione, cioè, se aggiorno la pagina, il browser richiede le risorse che dovrebbero essere memorizzate nella cache. Di seguito sono le intestazioni che sono sempre scambiate:HTTP Scade l'intestazione non rispettata dal browser?

 
https://192.168.1.180/scgi-bin/ajax/ajax.cgi 

GET /scgi-bin/ajax/ajax.cgi HTTP/1.1 
Host: 192.168.1.180 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729) 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Cache-Control: max-age=0 

HTTP/1.x 200 OK 
Date: Wed, 24 Jun 2009 20:26:47 GMT 
Server: Embedded HTTP Server. 
Connection: close 
Content-Type: text/html 
---------------------------------------------------------- 
https://192.168.1.180/scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057 

GET /scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057 HTTP/1.1 
Host: 192.168.1.180 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729) 
Accept: image/png,image/*;q=0.8,*/*;q=0.5 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Referer: https://192.168.1.180/scgi-bin/ajax/ajax.cgi 
Cache-Control: max-age=0 

HTTP/1.x 200 OK 
Date: Wed, 24 Jun 2009 20:26:47 GMT 
Server: Embedded HTTP Server. 
Connection: close 
Expires: Wed, 1 Jun 2011 20:00:00 GMT 
Content-Type: image/jpg 
---------------------------------------------------------- 

L'ajax.cgi restituisce una pagina HTML con un logo grafico (tramite lo script static.cgi), che mi piacerebbe memorizzati nella cache, ma il browser sta chiedendo il logo ad ogni aggiornamento.

+0

Vedo che stai lavorando su HTTPS. Potrebbe essere la ragione per cui non viene fatto il caching come te lo aspetti? Puoi provare una versione solo HTTP? – mark

risposta

13

Cosa stai facendo nel tuo browser? Sembra che tu faccia clic sul pulsante di ricarica o persino qualcosa come shift + Reload. Normalmente, il browser non invierà un'intestazione Cache-Control: max-age=0. Ciò significa che il browser ha gettato via l'immagine memorizzata nella cache e vuole recuperarla.

Se si passa a un'altra pagina e si torna indietro, il browser deve rispettare l'intestazione Scadenza.

Inoltre, è possibile aggiungere un'intestazione Cache-control: public alla risposta. Ciò consente esplicitamente ai proxy e al browser di memorizzare l'immagine nella cache.

+1

Questo sicuramente sembra giusto. Il browser (Firefox?) Sta inviando max-age = 0, il che significa che non vuole alcuna risposta più vecchia di 0, cioè, vuole colpire il server web di origine. Questa è la definizione di "aggiornamento". Allontanarsi dalla pagina, quindi incollare di nuovo l'URL e vedere cosa succede. –

+0

Effettivamente, stavo facendo un ricaricamento della pagina, e mi aspettavo che il browser ricaricasse l'html ma non tutte le risorse memorizzate nella cache. Ho pensato che dovevi fare shift-click (o control-click? Non ricordo) per forzare il browser a invalidare la cache su tutte le risorse. Suppongo che la mia comprensione non sia corretta? – user128602

+0

Non sono nemmeno sicuro di questo. Penso che i browser si comportino in modo diverso sul pulsante F5/Reload con/senza Shift. – chris166

0

Lo script CGI ha l'aspetto di un parametro di data/ora ... non sta cambiando, vero? Il browser deve trattare ogni URL univoco come un oggetto diverso nella cache, quindi se questo viene aggiornato con ogni richiesta, non corrisponderà all'immagine memorizzata nella cache.

Inoltre, il campo Scadenza non è esattamente nel formato RFC 1123, poiché sono necessarie due cifre per la data. Questo può o non può essere un problema, ma è qualcosa da verificare. Il browser include Cache-Control: max-age=0, che indica che ritiene che la cache sia potenzialmente obsoleta.

Una volta che il server riceve questa richiesta di convalida, può restituire 304 (Not Modified) o 200 (OK), come al momento.

+0

No, il timestamp non sta cambiando. E grazie per il suggerimento sul formato della data di scadenza, controllerò due volte. – user128602

16

Il browser ignora l'intestazione Scade se si aggiorna la pagina. Controlla sempre se la voce della cache è ancora valida contattando il server web. Idealmente, utilizzerà l'intestazione della richiesta If-Modified-Since in modo che il server possa restituire '304 Non modificato' se la voce della cache è ancora valida.

Non si sta impostando l'intestazione Last-Modified, quindi il browser deve eseguire un GET incondizionato del contenuto per assicurarsi che sia aggiornato.

Alcune regole pratiche per l'impostazione scade e Last-Modified sono descritte in questo post del blog:

http://blog.httpwatch.com/2007/12/10/two-simple-rules-for-http-caching/

+3

"Il browser ignora l'intestazione Expires se aggiorni la pagina." Grazie! Non lo sapevo –

+2

Quale browser fa? – Pacerier

0

Eventuali errori nel vostro certificato https farà sì che il browser per non rispetta le intestazioni.

Provalo senza https e verifica se funziona su semplice http.

Vai a questa risposta https://stackoverflow.com/a/17716911

Problemi correlati