Domanda

Mi sono guardato intorno ma non sono riuscito a capire se dovrei usare entrambi gli ETag E un'intestazione di scadenza O uno o l'altro.

Quello che sto cercando di fare è assicurarmi che i miei file flash (e altre immagini e cosa non solo vengano aggiornati quando si verifica una modifica a tali file.

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

Inoltre, c'è qualcosa che devo fare a livello di programmazione nei miei script PHP per supportare questo o è tutto Apache?

È stato utile?

Soluzione

Sono leggermente diversi: ETag non ha alcuna informazione che il client può usare 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ù ti avvicini 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 sta utilizzando 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.

Altri suggerimenti

Etag E Ultima modifica le intestazioni sono validatori.

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

Scade E Controllo della cache stanno dando aggiornare le informazioni.

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

Quindi la domanda di solito è quale validatore utilizzare, etag o ultimo modificato, e quale intestazione delle informazioni di aggiornamento utilizzare, scadenza o controllo della cache.

Expires e Cache-Control sono " potenti intestazioni di memorizzazione nella cache "

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

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

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

Per impostazione predefinita, Apache genererà un Etag basato su il numero di inode del file, la data dell'ultima modifica e la dimensione, 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 header Expires datato 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 è memorizzabile nella cache. Dai un'occhiata a mod_expires per configurarlo.

Un altro riassunto:

Devi usare entrambi. Gli ETag sono un & Quot; lato server & Quot; informazione. Scade un & Quot; Lato client & Quot; caching.

  • Usa ETag tranne se hai 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.

  • Scade deve essere usato con cautela, come se imposti una data di scadenza molto in futuro ma desideri cambiare immediatamente uno dei file (un file JS per esempio), alcuni utenti potrebbe non ottenere la versione modificata per molto tempo!

Un'altra cosa che vorrei ricordare è che alcune delle risposte che potrebbero esserci sfuggite sono il lato negativo di avere sia ETags che Expires/Cache-control nelle intestazioni.

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

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

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.

ETag è usato per determinare se una risorsa dovrebbe usare quella copia. e scade Header 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;)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top