ETag vs encabezado expira

Miré a mi alrededor, pero no he podido averiguar si debería usar un ETag y un encabezado de caducidad, o uno u otro.

Lo que estoy tratando de hacer es asegurarme de que mis archivos flash (y otras imágenes y lo que no solo se actualicen cuando hay un cambio en esos archivos).

No quiero hacer nada especial, como cambiar el nombre del archivo o poner algunos caracteres extraños al final de la url para que no se almacene en la caché.

Además, ¿hay algo que deba hacer programáticamente en mi extremo en mis scripts PHP para soportar esto o es todo Apache?

Son ligeramente diferentes: el ETag no tiene ninguna información que el cliente pueda usar para determinar si realiza o no una solicitud de ese archivo en el futuro. Si ETag es todo lo que tiene, siempre tendrá que hacer una solicitud. Sin embargo, cuando el servidor lee el ETag de la solicitud del cliente, el servidor puede determinar si envía el archivo (HTTP 200) o le dice al cliente que solo use su copia local (HTTP 304). Un ETag es básicamente solo una sum de comprobación para un archivo que cambia semánticamente cuando cambia el contenido del archivo.

El cliente utiliza el encabezado Expires (y proxies / caches) para determinar si necesita o no realizar una solicitud al servidor. Cuanto más cerca esté de la fecha de caducidad, más probable es que el cliente (o apoderado) realice una solicitud HTTP para ese archivo desde el servidor.

Entonces, realmente lo que quiere hacer es usar AMBAS cabeceras: establezca el encabezado Expira a un valor razonable en función de la frecuencia con la que cambia el contenido. A continuación, configure los ETags que se enviarán para que cuando los clientes DEBEN enviar una solicitud al servidor, pueda determinar más fácilmente si se envía el archivo o no.

Una última nota sobre ETag: si está utilizando una configuración de servidor de equilibrio de carga con varias máquinas que ejecutan Apache, probablemente querrá desactivar la generación de ETag. Esto se debe a que los inodos se utilizan como parte del algoritmo hash ETag, que será diferente entre los servidores. Puede configurar Apache para que no use inodos como parte del cálculo, pero luego querrá asegurarse de que las marcas de tiempo en los archivos sean exactamente las mismas, para garantizar que se genere el mismo ETag para todos los servidores.

Etag y los encabezados Last-modified son validadores .

Ayudan al navegador y / o al caché (proxy inverso) a comprender si un archivo / página ha cambiado, incluso si conserva el mismo nombre.

Expira y Cache-control están dando información de actualización .

Esto significa que informan, el navegador y el reverso entre los proxies, hasta qué momento o durante cuánto tiempo, pueden mantener la página / archivo en su caché.

Entonces, la pregunta generalmente es qué validador usar, etag o last-modified, y qué encabezado de actualización de información usar, expirar o cache-control.

Expires y Cache-Control son “fuertes encabezados de almacenamiento en caché”

Last-Modified y ETag son “encabezados de almacenamiento en caché débiles”

Primero, la comprobación del navegador Expires/Cache-Control para determinar si se realiza o no una solicitud al servidor

Si tiene que hacer una solicitud, enviará Last-Modified/ETag en la solicitud HTTP. Si el valor de Etag del documento coincide con eso, el servidor enviará un código 304 en lugar de 200 y ningún contenido. El navegador cargará los contenidos de su caché.

De manera predeterminada, Apache generará un Etag basado en el número de inodo, la fecha de última modificación y el tamaño del archivo, lo que debería ser perfectamente correcto para hacer lo que desee. Creo que también generará por defecto un encabezado Last-Modified basado en la última modificación de tiempo del archivo en el disco, que también está perfectamente bien para hacer lo que quiera.

Probablemente también deberías hacer que Apache envíe un encabezado Expires con fecha de un año en el futuro (según http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ) para que los navegadores sepan que el contenido es cacheable. Eche un vistazo a mod_expires para configurar eso.

Otro resumen:

Necesitas usar ambos. ETags son una información del “lado del servidor”. Los vencimientos son un caché “del lado del cliente”.

  • Use ETags, excepto si tiene un servidor con carga equilibrada. Son seguros y les informarán a los clientes que deben obtener nuevas versiones de los archivos de su servidor cada vez que cambien algo de su lado.

  • Expires debe usarse con precaución, ya que si establece una fecha de vencimiento en el futuro pero desea cambiar uno de los archivos de inmediato (un archivo JS, por ejemplo), es posible que algunos usuarios no obtengan la versión modificada hasta mucho tiempo.

Una cosa adicional que me gustaría mencionar es que algunas de las respuestas pueden haber fallado es la desventaja de tener tanto ETags como Expires/Cache-control en sus encabezados.

Dependiendo de sus necesidades, puede agregar bytes adicionales en sus encabezados, lo que puede boost los paquetes, lo que significa más sobrecarga de TCP. Una vez más, debería ver si es necesario tener en sus encabezados los gastos generales de tener ambas cosas en sus encabezados o simplemente agregará un peso adicional en sus solicitudes, lo que reduce el rendimiento.

Puede leer más sobre esto en esta excelente publicación de Kyle Simpson: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

Desde mi punto de vista, con Expira Header, el servidor puede decirle al cliente cuándo quedarán obsoletos mis datos, mientras que con Etag, el servidor verificará el valor de etag para cada solicitud del cliente.

    Intereting Posts