2010-03-11 6 views
31

Si tratta di un'app Web che serve le immagini. Poiché la stessa richiesta restituirà sempre la stessa immagine, desidero che i browser che accedono memorizzino le immagini nel modo più aggressivo possibile. Voglio quasi dirlo al browserChiedere ai browser di eseguire il cache nel modo più aggressivo possibile

Ecco la tua immagine. Vai avanti e tienilo; non cambierà davvero per i prossimi due giorni. Non c'è bisogno di tornare indietro. Veramente. Lo prometto.

faccio io, finora, impostare

Cache-Control: public, max-age=86400 
Last-Modified: (some time ago) 
Expires: (two days from now)

e, naturalmente, restituire un 304 not modified se la richiesta ha il If-Modified-Since intestazione appropriata.

C'è altro che posso fare (o qualcosa che dovrei fare in modo diverso) per trasmettere il mio messaggio ai browser?

L'app è ospitata su Google App Engine, nel caso ciò sia importante.

+5

Se non cambierà, un tempo di scadenza di 1 giorno (* max-age *) non è più di tanto. – Gumbo

+0

@ Gumbo: vero; come ho notato nella risposta di Sripathi Krishnan, questo sarà sicuramente aumentato. Mi chiedo ancora perché Gravatar lo imposta solo per 5 minuti. – balpha

+0

Puoi cambiare il tuo gravatar, quindi ha senso. –

risposta

12

Potreste essere interessati a verificare il seguente articolo di Google Code:

In poche parole, tutti i browser moderni dovrebbero essere in grado di memorizzare nella cache le immagini in modo appropriato secondo le istruzioni, con quelli Intestazioni HTTP

+1

Questa è una lettura interessante; Grazie. – balpha

1

Prova .htaccess come

<ifmodule mod_gzip.c> 
    mod_gzip_on Yes 
    mod_gzip_dechunk Yes 
    mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$ 
    mod_gzip_item_include handler ^cgi-script$ 
    mod_gzip_item_include mime ^text/.* 
    mod_gzip_item_include mime ^application/x-javascript.* 
    mod_gzip_item_exclude mime ^image/.* 
    mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* 
</ifmodule> 

<ifmodule mod_deflate.c> 
AddType application/x-compress .Z 
AddType application/x-gzip .gz .tgz 
AddType application/x-httpd-php .php 
AddType application/x-httpd-php .php3 
AddOutputFilterByType DEFLATE text/html 
AddOutputFilterByType DEFLATE text/plain 
AddOutputFilterByType DEFLATE text/xml 
AddOutputFilterByType DEFLATE application/x-httpd-php 
AddOutputFilterByType DEFLATE application/x-javascript 
</ifmodule> 

<ifmodule mod_expires.c> 
    ExpiresActive On 
    ExpiresDefault "access plus 1 seconds" 
    ExpiresByType text/html "access plus 1 seconds" 
    ExpiresByType image/gif "access plus 2592000 seconds" 
    ExpiresByType image/jpeg "access plus 2592000 seconds" 
    ExpiresByType image/png "access plus 2592000 seconds" 
    ExpiresByType text/css "access plus 604800 seconds" 
    ExpiresByType text/javascript "access plus 216000 seconds" 
    ExpiresByType application/x-javascript "access plus 216000 seconds" 
</ifmodule> 

<ifmodule mod_headers.c> 
    <filesMatch "\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$"> 
    Header set Cache-Control "max-age=2592000, public" 
    </filesmatch> 
    <filesMatch "\\.(css)$"> 
    Header set Cache-Control "max-age=604800, public" 
    </filesmatch> 
    <filesMatch "\\.(js)$"> 
    Header set Cache-Control "max-age=216000, private" 
    </filesmatch> 
    <filesMatch "\\.(xml|txt)$"> 
    Header set Cache-Control "max-age=216000, public, must-revalidate" 
    </filesmatch> 
    <filesMatch "\\.(html|htm|php)$"> 
    Header set Cache-Control "max-age=1, private, must-revalidate" 
    </filesmatch> 
</ifmodule> 
+0

L'applicazione è su Google App Engine; non c'è '.htaccess' (o Apache, se è per questo) – balpha

+0

Oops Ho trascurato quello. In ogni caso lo sto facendo in modo che possa aiutare quelli con Apache. –

10

Si può fare di meglio. 304 sono ancora una richiesta/risposta HTTP. Sebbene l'immagine non venga scaricata di nuovo, la latenza può essere letale.

Se è possibile includere un identificativo della versione nei nomi delle immagini, è possibile impostare il max-age a 2 anni. In questo modo, prevedi 304s. Se l'immagine cambia, aggiorna l'identificativo della versione cambiando il nome del file. Ciò garantisce che il browser invierà una nuova richiesta.

Ha bisogno di alcune modifiche alla struttura del progetto. L'identificativo della versione può essere il numero di revisione SVN al momento dell'ultimo aggiornamento dell'immagine e può essere generato automaticamente al momento della compilazione. Dovresti anche aggiornare l'html, quindi se hai una mappatura logica tra il nome dell'immagine e il percorso dell'immagine, il tuo lavoro sarebbe più semplice.

immagini sono raramente aggiornati, così si potrebbe anche seguire un approccio manuale, se non è possibile automatizzare quello che ho descritto sopra. Il trucco è aggiungere solo nuove immagini, mai modificarle.

+0

Queste sono alcune buone idee. La lunga età massima è qualcosa che farò sicuramente; anche se penso di aver letto che un anno è il massimo consentito secondo la RFC. L'identificatore della versione è qualcosa a cui ho pensato, ma sfortunatamente non è un'opzione. L'app serve solo le immagini per essere incluse in altre pagine web (pensa come Gravatar). – balpha

+0

@Sripathi Krishnan: ma la latenza di uccisione sembra non poter essere evitata! Il browser effettua nuovamente le richieste HTTP per le immagini anche usando 'mod_expires' ogni volta che chiudi il browser e lo apri di nuovo sulla stessa pagina. Non scarica l'immagine dopo la risposta del server, ma continua a chiedere al server aumentando così la latenza. Vedi la mia domanda, forse hai un'idea: http: // StackOverflow.it/questions/10048740/stop-browser-to-make-http-richieste-per-immagini-che-dovrebbe-restare-cache-mod-expi –

+0

Come da sezione 14.21 di rfc2616, "I server HTTP/1.1 NON DEVONO inviare scadenze risale a più di un anno nel futuro. "; un anno è il tuo massimo –

2

V'è un valore molto importante sul colpo di testa di cache che non ho menzionato qui:

"post-check = 900, pre-check = 3600"

Leggi questo articolo su questo argomento (e la ricerca di più):

http://www.rdlt.com/cache-control-post-check-pre-check.html

+4

È interessante, grazie. Vale la pena citare alcune cose: Questo è solo IE, il post che si collega a se stesso collega ad un articolo piuttosto vecchio, e non trovo alcuna menzione del tuo claim "i tuoi clienti chiedono sempre ..."; al contrario, nei thread dei commenti ci sono molte indicazioni che IE in realtà onora le intestazioni standard. – balpha

+0

Forse è solo per esempio, non lo so. Quello che so è che vedo su google chrome e mozilla firefox, sugli strumenti di sviluppo, che dal momento in cui applico questo valore, è sempre il momento di fermarmi, le immagini. La verità è che sto lavorando in fretta, e dopo aver visto che funziona meglio, non l'ho controllato troppo in profondità. Forse all'interno del codice sorgente di Chrome c'è una vera novità se questi valori vengono utilizzati o meno. – Aristos

+0

Rimuovere "Senza questa intestazione, i browser dei tuoi clienti chiedono sempre le tue pagine e le tue immagini anche se hai impostato le intestazioni che menzioni". perché non l'ho controllato per soure. Ho trovato anche questo articolo relativo. http://www.google.co.uk/support/forum/p/Chrome/thread?tid=384b6abc105a67e5&hl=en – Aristos

2

non so ° Aiuterà oltre le soluzioni offerte da altri, ma è possibile utilizzare le strutture HTML5 offline web apps per chiedere esplicitamente al browser di memorizzare una copia locale.

+0

Questa è una buona idea. Non sarà di aiuto nel mio caso (perché servo solo le immagini, non controllo l'HTML delle pagine che includono queste immagini). Ma buono a sapersi per il caso generale. +1 – balpha

1

È potrebbe aggiungere un ETag rappresentazione per ogni immagine e poi confrontarlo con il If-None-Match intestazione richieste in entrata (vedi "Why isn’t my custom delivered image caching in the browser?"). Questo è ridondante quando si utilizza l'intestazione Last-Modified preferita ed è comunque un altro modo di dire 304. (Penso che GAE lo faccia automaticamente per i file statici, non è sicuro.)

Gravatar imposta date molto vecchie Last-Modified - il valore predefinito sembra essere "Mer, 11 gennaio 1984 08:00:00 GMT". La scadenza di 5 minuti induce i browser a controllare frequentemente le immagini aggiornate. In altre parole, penso che stiano invitando 304, non tentando di convincere i browser ad usare solo la cache locale. Intestazioni simile a questa:

Date: Sat, 20 Mar 2010 07:52:43 GMT 
Last-Modified: Wed, 11 Jan 1984 08:00:00 GMT 
Expires: Sat, 20 Mar 2010 07:57:43 GMT 
Cache-Control: max-age=300 

La grande differenza è il tempo di scadenza - si desidera che due giorni, vogliono cinque minuti. Quindi, se vuoi che i browser utilizzino l'immagine memorizzata nella cache per 48 ore, fai ciò che stai facendo, imposta solo Cache-Control: max-age=172800 (86400 in 24 ore).

1

Alcuni giorni età cache è molto bassa. Dovresti impostarlo su un anno o anche più. Naturalmente questo potrebbe sollevare problemi quando l'immagine cambia in realtà, ma si può risolvere che con l'aggiunta di un numero di versione per l'immagine e cambiare la pagina che fa riferimento l'immagine per includere il percorso per la nuova immagine.

ho scritto più su applicazioni Web caching qui: http://patchlog.com/web/7-methods-to-cache-web-applications/

+0

Mi stai prendendo in giro? Sono a favore del dubbio e apprezzo sempre i consigli o l'aiuto che mi danno le persone nelle loro risposte. Ma scrivere più o meno la stessa cosa di Sripathi Krishnan ha fatto più di una settimana fa (solo con maggiori dettagli) solo per collegarmi al tuo blog, il tuo blog, che io chiamo spam. – balpha

+0

Questo potrebbe essere difficile da credere, ma non ho visto la sua risposta prima di pubblicare. E anche il mio post ha più idee sul caching, ma ovviamente è più semplice liquidare qualcosa e votare giù invece di leggere un post piuttosto lungo. –

+0

Che ci crediate o no, il downvote non è mio. Tuttavia, il tuo post sul blog (che non trovo molto lungo, il testo collegato nella risposta accettata è molto più lungo) non ha nulla a che fare con il mio problema. – balpha

Problemi correlati