2009-02-01 15 views
323

Ho guardato in giro ma non sono stati in grado di capire se devo usare sia un ETag e un'intestazione Expires o uno o l'altro.ETag vs Expires

Quello che sto cercando di fare è assicurarsi che i miei file Flash (e altre immagini e ciò non solo si aggiorna quando c'è un cambiamento a questi file.

Non voglio fare niente di speciale come cambiare il nome del file o mettere alcuni caratteri strani alla fine dell'URL per far sì che non venga memorizzato nella cache

Inoltre, c'è qualcosa che ho bisogno di fare programmaticamente da parte mia nei miei script PHP per supportare questo o è tutto Apache?

+0

https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching (buono in generale) –

risposta

621

Sono leggermente diversi: l'ETag non dispone di alcuna informazione che il client può utilizzare per determinare se inoltrare o meno una richiesta per tale file in futuro. Se ETag è tutto ciò che ha, dovrà sempre fare una richiesta. Tuttavia, quando il server legge ETag dalla richiesta del client, il server può quindi decidere se inviare il file (HTTP 200) o dire al client di usare solo la loro copia locale (HTTP 304). Un ETag è fondamentalmente solo un checksum per un file che cambia semanticamente quando cambia il contenuto del file.

L'intestazione Expires viene utilizzata dal client (e dai proxy/cache) per determinare se è necessario o meno effettuare una richiesta al server. Più sei vicino alla data di scadenza, più è probabile che il client (o il proxy) effettui una richiesta HTTP per quel file dal server.

Quindi, davvero quello che vuoi fare è utilizzare ENTRAMBI le intestazioni - imposta l'intestazione Expires su un valore ragionevole in base alla frequenza con cui il contenuto cambia. Quindi configurare gli ETag da inviare in modo che quando i client DEVONO inviare una richiesta al server, è più facile determinare se inviare o meno il file.

Un'ultima nota su ETag: se si sta utilizzando un'installazione server con bilanciamento del carico con più macchine che eseguono Apache, probabilmente si vorrà disattivare la generazione di ETag. Questo perché gli inode sono usati come parte dell'algoritmo di hash ETag che sarà diverso tra i server. È possibile configurare Apache in modo che non utilizzi gli inode come parte del calcolo, ma in questo caso si desidera assicurarsi che i timestamp dei file siano esattamente gli stessi, per garantire che lo stesso ETag venga generato per tutti i server.

+36

Questa risposta ha appena reso la mia giornata. Abbiamo discusso con la questione etag perché né gli sviluppatori né il responsabile IT (che chiedeva l'aggiunta di etags) potevano spiegare completamente i casi d'uso. Grazie! –

+52

Il mio lavoro qui è finito. :) –

+8

Dovresti anche controllare se dovresti usare Cache-Control invece di Expires. La mia comprensione è che Cache-Control è stato introdotto dopo la scadenza e ti dà più controllo. Vedi http://stackoverflow.com/questions/5799906/whats-the-difference-between-expires-and-cache-control-headers –

19

Per impostazione predefinita, Apache genererà un Etag based on il numero di inode del file, la data dell'ultima modifica, e dimensione, che dovrebbe essere perfettamente bene per fare quello che vuoi. Penso che genererà anche di default un'intestazione Last-Modified basata sull'ultima ora di modifica del file su disco, che è anche perfettamente adatto a fare ciò che vuoi.

Probabilmente è probabile che Apache invii un'intestazione Expires datata un anno in futuro (in base allo http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21) in modo che i browser sappiano che il contenuto è memorizzabile nella cache. Dai un'occhiata a mod_expires per configurarlo.

+0

Quindi l'ETag avrà l'ultima modifica e l'intestazione scade lo dirà che lo voglio in cache e quando carico e sovrascrivo il mio file, verrà semplicemente tirato giù nella cache dell'utente altrimenti un 304 sarebbe generato correttamente? – GeoffreyF67

+0

L'Etag dipende in modo complicato dalla data dell'ultima modifica; ma quando modifichi il file, l'Etag cambierà. Quindi l'Etag inviato dal browser (per la versione cache del file) non corrisponderà all'Eag del file sul server e Apache invierà il file anziché una risposta 304. –

+5

L'anno in cui scadrà l'intestazione non dirà al cliente di non controllare nemmeno una nuova versione per un anno? –

97

Etag e dell'ultima modifica intestazioni sono validatori.

Aiutano il browser e/o la cache (proxy inverso) per capire se un file/pagina è cambiato, anche se conserva lo stesso nome.

Scade e Cache-control stanno dando informazioni di aggiornamento.

Ciò significa che informano, il browser e i proxy inversi tra loro, fino a che ora o per quanto tempo, possono mantenere la pagina/il file nella loro cache.

Quindi la domanda di solito è quale validatore utilizzare, etag o modificato per ultimo, e quali aggiornare l'intestazione delle informazioni da usare, scade o il controllo della cache.

26

Expires e Cache-Control sono "forti intestazioni di cache"

Last-Modified e ETag sono "intestazioni di cache deboli"

In primo luogo il controllo del browser Expires/Cache-Control per determinare se o non fare una richiesta al server

Se si deve fare una richiesta, invierà Last-Modified/ETag nella richiesta HTTP. Se il valore del documento Etag corrisponde a quello, il server invierà un codice 304 anziché 200 e nessun contenuto. Il browser caricherà i contenuti dalla sua cache.

+0

trovi che qualche documento supporta il comportamento di caching "forte e debole"? Non sono riuscito a trovarne uno, e ora il browser del mio client assegna la priorità alla scorsa modifica dell'ultimo aggiornamento, che non capisco perché. – GMsoF

+1

@GMsoF Puoi dare un'occhiata a questo: http://tools.ietf.org/html/rfc7232#section-2.1 – Medeiros

+0

Quindi, se voglio assicurarmi che le mie modifiche vengano propagate immediatamente al client, ma beneficio ancora per alcuni caching, posso usare solo Last-Modified e ETag giusto? –

10

Un altro riepilogo:

È necessario utilizzare entrambi. Gli ETag sono informazioni "lato server". La scadenza è un caching "lato client".

  • Usa ETags tranne se si dispone di un server con bilanciamento del carico. Sono sicuri e permetteranno ai clienti di sapere che dovrebbero ottenere nuove versioni dei file server ogni volta che cambi qualcosa dalla tua parte.

  • Valida deve essere utilizzato con cautela, come se si imposta una data di scadenza lontano nel futuro, ma desidera modificare uno dei file immediatelly (un file JS per esempio), alcuni utenti potrebbero non ottenere la versione modificata fino a tanto tempo!

+0

In questo caso, è necessario rinominare js e cambiarlo nel codice HTML, e sperare che non sia stato impostato il timeout del file HTML anche per 1 anno. – EralpB

0

Una cosa aggiuntiva vorrei ricordare che alcune delle risposte può aver perso è il lato negativo di avere sia ETags e Expires/Cache-control nelle intestazioni.

A seconda delle esigenze, è sufficiente aggiungere ulteriori byte nelle intestazioni che potrebbero aumentare i pacchetti, il che significa più sovraccarico TCP. Ancora una volta, dovresti vedere se il sovraccarico di avere entrambe le cose nelle intestazioni è necessario o semplicemente aggiungerà un peso extra alle tue richieste che riduce le prestazioni.

Si può leggere di più su di esso su questo eccellente post sul blog di Kyle Simpson: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

1

A mio avviso, con Expire intestazione, il server può dire al cliente quando i miei dati sarebbero stantio, mentre con l'ETAG, server potrebbe controlla il valore di etag per ogni richiesta del cliente.

Problemi correlati