Domanda

Qual è un buon metodo per generare programmaticamente etag per le pagine Web, e questa pratica è raccomandata? Alcuni siti consigliano di disattivare gli etag, altri consigliano di produrli manualmente e alcuni consigliano di lasciare attive le impostazioni predefinite: qual è il modo migliore qui?

È stato utile?

Soluzione

Gli ETag sono utili quando si utilizza un meccanismo di memorizzazione nella cache di fronte al generatore di siti Web. I browser stessi non li usano, ascoltano " (se) modificato da " o "età" header header, afaik.

Comunque, per la sua semplice natura non è un problema fornire un'intestazione http con un ETag. Ho sentito che molti server web prendono semplicemente la posizione del file e il timestamp del file e fanno un hash md5 su questi dati.

Abbiamo, ad esempio, creato un etag semplice ma efficace con il nostro software. Ogni "unità di contenuto" (vale a dire html, jpegs, gif ...) nel nostro software ha un ID univoco e un numero di versione (ovvero un jpeg ha l'id "17" e la versione "2", ciò significa che è stato cambiato una volta). Quindi ETag è semplicemente la stringa "id-version", qui: "17-2". Con la prossima modifica sarebbe "17-3" in modo che il cacher riconosca la modifica, carica la nuova parte di contenuto (una volta) completamente e la memorizza nella sua cache.

Ma probabilmente potresti usare anche l'URL e un timestamp (ovvero il timestamp del file).

Altri suggerimenti

Raccomando di generare un hash del contenuto, ad es. md5 ($ content) .
Inoltre, per prevenire la collisione dell'hash, potresti voler aggiungere ad es. l'ID dell'elemento di contenuto (se questo è appropriato).

Bene, gli ETag hanno senso quando si fa molto affidamento sulla memorizzazione nella cache. Sono un ottimo indicatore dello stato di una risorsa (ad esempio un URL).

Ad esempio, supponiamo che tu usi una richiesta ajax per estrarre gli ultimi commenti di un utente e vuoi sapere se ci sono nuovi commenti. Cambiare ETag in avvisa l'applicazione di nuovi contenuti è un modo meno costoso di verificarlo.

Perché se ETag è lo stesso, puoi conservare la tua cache, ma altrimenti ricostruirla.

Anche gli ETag hanno molto senso con le API RESTful.

Per quanto riguarda la sua generazione, guardando le spec , penso che tu possa fare quasi tutto quello che vuoi. Un timestamp, un hash, qualunque cosa abbia senso per te / la tua applicazione.

Ho appena acceso YSlow e mi sono lamentato per Etags, quindi ho fatto una piccola ricerca. Il problema, secondo il Blog di Yahoo (vedi i commenti anche) è che le implementazioni ETags predefinite usano il numero di inode del file o il numero di revisione ntfs o altro ugualmente specifico del server come parte dell'hash. Questo, pur essendo veloce, sostanzialmente impedisce allo stesso file di essere servito da 2 server diversi di avere lo stesso etag e rovina entrambi i browser e le cache a valle o i saldi di carico.

Il suggerimento precedente di utilizzare un hash MD5 è valido, anche se è necessario evitare che ciò diventi un problema di prestazioni in sé e per sé. L'implementazione di questi suggerimenti spetta al lettore, anche se a me non sembra che questo sia il genere di cose che il tuo framework potrebbe essere in grado di gestire per te.

Per quanto mi riguarda, dal momento che sono in un ambiente semplice in cui il timestamp del file sarà più che adeguato, li ho appena disattivati ??in Apache usando FileETag none nel mio file .htaccess. Questo interrompe YSlow e dovrebbe far ricadere le cose all'ultima data modificata sul file.

Generalmente, i "siti" che scoraggia il loro utilizzo è Yahoo, e questo perché alcuni server Web predefiniti non creano automaticamente ETAG che funzionano in server farm. (Che è corretto e preciso di Yahoo per rivendicare.)

Ma, se hai un singolo server web, allora stai bene. In caso contrario, ti consigliamo di verificare come il tuo server web gestisce questo e agire in modo appropriato.

Mufasa,

Yahoo (e YSlow) ne incoraggiano effettivamente l'uso, ma con l'avvertenza che gli ETag generati automaticamente differiranno da server a server.

Non posso ancora votare, quindi dirò solo che sono d'accordo con il suggerimento di un hash del percorso del file e del timestamp (o il nome della tabella + valore del campo primario + timestamp se rappresentato dal contenuto del db).

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