C'è più di un modo per memorizzare nella cache.
Condizionale OTTENERE
Se stai memorizzando queste immagini sul file system e le stai servendo direttamente attraverso il web server, probabilmente stai già utilizzando get condizionale . Il server Web utilizzerà automaticamente i metadati del filesystem per impostare un'intestazione ETAG e risponderà automaticamente con "304 Not Modified" se il browser include If-Modified-Since
o If-Matches
intestazioni nella sua richiesta. (Tutti i browser lo faranno.)
In questo caso l'intera immagine non viene restituita, quindi si ha un risparmio di larghezza di banda. Tuttavia, verrà comunque emessa una richiesta GET, quindi avrai comunque il sovraccarico e la latenza di una richiesta.
Puoi ridurre leggermente il numero di richieste a scapito della freschezza della cache facendo impostare al server web le Cache-Control
intestazioni con un public,max-age=N
valore per le tue immagini. Ciò significa che le cache possono conservare la risorsa per un massimo di max-age
secondi prima che debbano verificare se è stata aggiornata.
Tuttavia, HTTP definisce solo un modo per invalidare una voce della cache, che potrebbe non adattarsi alla semantica della tua applicazione: se POST o PUT a un URL che aggiorna la foto del profilo, rispondi con Location: [url of photo]
un'intestazione e la voce della cache per quell'URL verrà invalidata.
(Questo è il meccanismo che ti consente di memorizzare nella cache una pagina web con commenti e quindi ricaricare forzatamente la pagina dal browser dopo che l'utente ha pubblicato un nuovo commento. Il browser risponderebbe a POST /comment
con 303 See Other
e a Location: /page/with/comment
. Nota che questo non ha usato funzionare in Firefox a causa di un bug di vecchia data .)
A meno che tu non abbia molto traffico, questo approccio alla cache va bene.
Modifica degli URL
Un url è una rappresentazione di una risorsa, quindi un altro modo per gestire la memorizzazione nella cache non è modificare i parametri della cache per la risorsa, ma creare una nuova risorsa con una direttiva "cache per sempre". Questo è l'approccio che i "ragazzi grandi" prediligono, perché permette loro di non generare richieste extra, risparmiando loro molta larghezza di banda. Il rovescio della medaglia è che richiede molta più contabilità aggiuntiva.
Esistono due tecniche generali per questo.
Stringhe di query
I server Web ignorano le stringhe di query durante la pubblicazione di un file dal file system. Le cache, tuttavia, non lo fanno: /1.jpg?t=12345
e /1.jpg?t=67890
sono due risorse completamente diverse e non correlate, anche se il server pensa che siano le stesse.
Quindi una cosa semplice che puoi fare è aggiungere il timestamp del filesystem come stringa di query ogni volta che fai riferimento a una risorsa nel tuo html e imposti Expires
un'intestazione lunga . Il browser memorizzerà quindi questa risorsa per sempre e non eseguirà alcun GET purché la stringa di query non cambi.
Un aspetto negativo è che è difficile o impossibile istruire il server web del nuovo URL per un elemento se si desidera invalidare forzatamente una cache. Ad esempio, se un browser ha una pagina HTML memorizzata nella cache con un /1.jpg?v=1
riferimento, ma /1.jpg?v=1
è riuscito a cancellare la voce per (forse ha esaurito lo spazio di file o memoria), farà una nuova richiesta a /1.jpg?v=1
. Se nel frattempo l'immagine è cambiata in /1.jpg?v=2
, la risposta corretta è:
- Servire la vecchia versione del file. Lo faresti se volessi che tutte le risorse fossero coerenti tra loro come in un certo momento. Questo è ciò che dovresti fare con i file CSS, ad esempio, poiché un nuovo file CSS con un vecchio file html potrebbe non funzionare correttamente!
- Reindirizzare alla nuova versione del file utilizzando
301 Moved Permanently
. Lo faresti se volessi che tutte le risorse siano le più nuove possibili.
Entrambi sono difficili da fare con un solo server web, il che significa che è necessario invocare un'applicazione Web anche per richieste di immagini, che può essere sia più complicata che più dispendiosa in termini di risorse. I server web sono molto veloci nel servire i file, quindi il sovraccarico di un'applicazione web potrebbe finire per inghiottire la tua larghezza di banda e i guadagni di latenza.
Nomi dei file
Invece di aggiungere una stringa di query, si modifica il nome file. Ciò significa che è facile mantenere più versioni dei file nel file system, ma probabilmente sarà necessario archiviare i metadati dei file e fare altri libri contabili per tenere traccia delle proprie risorse e dei loro nomi.