Scadenza ETag vs Header


359

Mi sono guardato intorno ma non sono stato in grado di capire se dovrei usare sia un ETag che un header Expires o l' uno o l'altro.

Quello che sto cercando di fare è assicurarmi che i miei file flash (e altre immagini e cosa non vengano aggiornati solo in caso di modifica di tali file.

Non voglio fare nulla di speciale come cambiare il nome del file o mettere alcuni caratteri strani alla fine dell'URL per evitare che venga memorizzato nella cache.

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


Risposte:


677

Sono leggermente diversi: ETag non ha alcuna informazione che il client può utilizzare per determinare se in futuro fare nuovamente una richiesta per quel file. 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 determinare se inviare il file (HTTP 200) o dire al client di utilizzare semplicemente la propria 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ù ci si avvicina alla data di scadenza, più è probabile che il client (o proxy) effettui una richiesta HTTP per quel file dal server.

Quindi davvero quello che vuoi fare è usare ENTRAMBE le intestazioni: imposta l'intestazione Scadenza su un valore ragionevole in base alla frequenza con cui cambia il contenuto. Quindi configurare ETags per l'invio in modo che quando i client inviano una richiesta al server, possa determinare più facilmente se inviare o meno il file.

Un'ultima nota su ETag: se si utilizza un'impostazione del server con bilanciamento del carico con più macchine che eseguono Apache, è probabile che si desideri disattivare la generazione di ETag. Questo perché gli inode sono utilizzati come parte dell'algoritmo di hash ETag che sarà diverso tra i server. Puoi configurare Apache in modo che non utilizzi gli inode come parte del calcolo, ma poi assicurati che i timestamp sui file siano esattamente gli stessi, per garantire che lo stesso ETag venga generato per tutti i server.


12
Dovresti anche verificare se dovresti usare Cache-Control invece di Scadenza. La mia comprensione è che Cache-Control è stato introdotto dopo Scadenza e offre maggiore controllo. Vedi stackoverflow.com/questions/5799906/…
Luis Perez

6
Quando si utilizza l'intestazione Expires è buona norma modificare il nome del file ogni volta che una risorsa cambia, poiché il client non richiederà nuovamente il file prima che sia obsoleto. Soprattutto se stai usando valori molto futuri come data di scadenza.
schnatterer,

8
Diciamo che useremo entrambi. Cosa succede quando il tempo di scadenza è scaduto, ma il file non viene modificato (L'Etag è lo stesso)? Il server restituirà 304 e il file verrà servito dalla cache del browser. La mia domanda è, sarà rigenerato il tempo di scadenza in questo momento?
user345602

2
Fare attenzione a impostare ETAG e l'intestazione Expires su un valore diverso da zero. Questo può portare a condizioni di gara. Vedi jakearchibald.com/2016/caching-best-practices
Weston

2
È possibile dire ai server di non usare affatto inode o timestamp? Inoltre, perché sono necessari per gli ETag, se utilizzato per rappresentare solo il contenuto?
Cesar Castro,

108

Le intestazioni Etag e Ultima modifica sono validatrici .

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

Scade e il controllo della cache fornisce informazioni di aggiornamento .

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

Quindi la domanda di solito è quale validatore usare, etag o ultima modifica e quale aggiornamento delle informazioni di informazione usare, scade o controlla la cache.


31

Expirese Cache-Controlsono "potenti intestazioni di cache"

Last-Modifiede ETagsono "intestazioni di cache deboli"

Innanzitutto il browser controlla Expires/Cache-Controlper determinare se effettuare o meno una richiesta al server

Se è necessario effettuare una richiesta, invierà Last-Modified/ETagla richiesta HTTP. Se il Etagvalore del documento corrisponde a quello, il server invierà un codice 304 anziché 200 e nessun contenuto. Il browser caricherà i contenuti dalla sua cache.


1
trovi qualche documento a supporto del comportamento di memorizzazione nella cache "forte e debole"? Non sono riuscito a trovarne uno e il mio browser client ora dà la priorità all'ultima modifica rispetto alla scadenza effettiva, cosa che non capisco perché.
GMsoF,

1
@GMsoF Potresti dare un'occhiata a questo: tools.ietf.org/html/rfc7232#section-2.1
Medeiros,

Quindi, se voglio assicurarmi che le mie modifiche vengano propagate immediatamente al client, ma che comunque traggano vantaggio dalla memorizzazione nella cache, posso usare solo Last-Modified ed ETag giusto?
Sebastien Lorber,

Questa è la risposta più concisa eppure la più chiara per me! Grazie.
aderchox

18

Per impostazione predefinita, Apache genererà un Etag in base al numero di inode del file, alla data dell'ultima modifica e alle dimensioni, che dovrebbe andare perfettamente bene per fare quello che vuoi. Penso che genererà anche un'intestazione Last-Modified basata sull'ultima modifica del file sul disco, che è anche perfettamente adatta a fare quello che vuoi.

Probabilmente dovresti anche fare in modo che Apache invii un'intestazione Expires datata un anno in futuro (secondo http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ) in modo che i browser sappiano che il contenuto è cacheable. Dai un'occhiata a mod_expires per configurarlo.


Quindi ETag avrà l'ultima modifica e l'intestazione di scadenza gli dirà che voglio che sia memorizzato nella cache e quando caricherò e sovrascriverò il mio file, questo verrà semplicemente riportato di nuovo nella cache dell'utente altrimenti verrebbe generato un 304 giusto?
Geoffrey

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 sua versione cache del file) non corrisponderà all'Etag del file sul server e Apache invierà il file anziché una risposta 304.
David Z,

6
L'intestazione scade un anno non dice al client di non controllare nemmeno una nuova versione per un anno?
John Bachir,

@John: sì, immagino che stavo pensando a contenuti statici che non cambiano mai quando l'ho scritto.
David Z,

2
@John Bachir: questo dovrebbe essere atteso bene, ma il browser sembra colpire comunque il server almeno per chiedere una versione più recente. Ho aperto un'altra domanda su questo problema: stackoverflow.com/questions/10048740/...
Marco Demaio

13

Un altro riassunto:

Devi usare entrambi. Gli ETag sono informazioni "lato server". Scade una cache "lato client".

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

  • Scadenza deve essere utilizzata con cautela, come se imposti una data di scadenza molto in futuro, ma desideri cambiare immediatamente uno dei file (ad esempio un file JS), alcuni utenti potrebbero non ottenere la versione modificata fino a molto tempo!


2
In caso di questa situazione Scadenza devi fondamentalmente rinominare il tuo js e cambiarlo nel tuo HTML, e spero che non hai impostato la scadenza del file HTML anche 1 anno.
EralpB,

1

Un'altra cosa che vorrei ricordare è che alcune delle risposte che potrebbero esserci sfuggite sono il lato negativo di avere entrambi ETagse Expires/Cache-controlnelle intestazioni.

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

Puoi leggere di più a riguardo su questo eccellente post di Kyle Simpson: http://calendar.perfplanet.com/2010/bloated-request-response-headers/


1

A mio avviso, con Expire Header, il server può dire al client quando i miei dati sarebbero obsoleti, mentre con Etag, il server controllerebbe il valore etag per il client 'ogni richiesta.


0

ETag viene utilizzato per determinare se una risorsa deve utilizzare quella di copia. e si espande Intestazione come Cache-Control viene detto al client che prima dei decenni di cache, il client dovrebbe recuperare la risorsa locale.

Nei siti moderni, ci sono spesso offerte di un file chiamato hash, come app.98a3cf23.js, quindi è una buona pratica usare Expires Header. Oltre a ciò, riduce anche il costo della rete.

Spero che sia d'aiuto ;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.