caching - página - ¿Cuál es la mejor manera de crear un etag?
recommended cache control (6)
¿Cuál es un buen método para generar estadísticamente etag para páginas web? ¿Se recomienda esta práctica? Algunos sitios recomiendan desactivar los etags, otros recomiendan producirlos manualmente, y algunos recomiendan dejar la configuración predeterminada activada, ¿cuál es la mejor manera aquí?
Acabo de encender YSlow y se quejó de Etags, así que investigué un poco. El problema, según el blog de Yahoo (véanse también los comentarios), es que las implementaciones predeterminadas de ETags usan el número de inodo del archivo o el número de revisión ntfs o cualquier otra cosa igualmente específica del servidor como parte del hash. Esto, aunque es rápido, básicamente evita que el mismo archivo servido por 2 servidores diferentes tenga el mismo etag y arruine tanto los navegadores como los cachés o los balances de carga en sentido descendente.
La sugerencia anterior de utilizar un Hash MD5 es buena, aunque debe evitar que se convierta en un problema de rendimiento en sí mismo. La implementación de esas sugerencias sigue siendo para el lector, aunque fuera de mi alcance me parece que este es el tipo de cosas que su marco podría manejar para usted.
Para mí, dado que estoy en un entorno simple donde la fecha y hora del archivo será más que adecuada, simplemente los FileETag none
en Apache usando FileETag none
en mi archivo .htaccess. Esto cierra YSlow y debe hacer que las cosas vuelvan a la última fecha de modificación en el archivo.
Bueno, los ETags tienen sentido cuando confías mucho en el almacenamiento en caché. Son un excelente indicador del estado de un recurso (por ejemplo, una URL).
Por ejemplo, supongamos que utiliza una solicitud ajax para obtener los últimos comentarios de un usuario y desea saber si hay algún comentario nuevo. Cambiar el ETag para alertar a su aplicación de contenido nuevo es una forma menos costosa de verificarlo.
Porque si el ETag es el mismo, puede mantener su caché, pero de lo contrario, reconstruirlo.
Los ETags también tienen mucho sentido con las API RESTful.
En cuanto a generarlo, mirando las spec , creo que puedes hacer casi cualquier cosa que quieras. Una marca de tiempo, un hash, lo que tenga sentido para usted / su aplicación.
En general, los "sitios" que desalientan su uso son Yahoo, y eso se debe a que algunos servidores web predeterminados no crean automáticamente ETAG que funcionen en granjas de servidores. (Que es correcto y preciso de Yahoo para reclamar).
Pero, si tiene un solo servidor web, entonces está bien. De lo contrario, querrá verificar cómo funciona su servidor web y actuar de forma adecuada.
Los ETags sí ayudan cuando se usa algún tipo de mecanismo de almacenamiento en caché frente a su generador de sitios web. Los propios navegadores no los usan, escuchan estructuras de cabecera "(si) modificadas desde" o "edad", afaik.
De todos modos, debido a su naturaleza simple, no es un problema proporcionar un encabezado http con un ETag. Escuché que muchos servidores web simplemente toman la ubicación del archivo y la marca de tiempo del archivo y hacen md5-hash sobre estos datos.
Nosotros, como ejemplo, construimos un etag simple pero efectivo con nuestro software. Cada "unidad de contenido" (es decir, html, jpegs, gifs ...) en nuestro software tiene una identificación única y un número de versión (es decir, un jpeg tiene el id "17" y la versión "2", esto significa que se cambió una vez) . Entonces ETag simplemente es la cadena "id-version", aquí: "17-2". Con el siguiente cambio sería "17-3" para que el caché reconozca el cambio, cargue completamente la nueva parte del contenido (una vez) y lo almacene en su propio caché.
Pero probablemente también puedas usar la URL y una marca de tiempo (es decir, la marca de tiempo del archivo).
Mufasa,
Yahoo (y YSlow) realmente fomentan su uso, pero con la advertencia de que los ETags autogenerados diferirán de un servidor a otro.
Todavía no puedo votar, así que solo diré que estoy de acuerdo con la sugerencia de un hash de la ruta del archivo y la marca de tiempo (o el nombre de la tabla + valor del campo primario + marca de tiempo si está representado por el contenido de db).
Recomiendo generar un hash del contenido, por ejemplo md5($content)
.
Además, para evitar la colisión hash, es posible que desee agregar, por ejemplo, la ID del elemento de contenido (si es apropiado).