2009-02-01 16 views
323

He mirado alrededor, pero no he sido capaz de averiguar si debería utilizar tanto un ETag y un Expira cabecera o uno o el otro.ETag vs cabecera Expira

Lo que estoy tratando de hacer es asegurarse de que mis archivos flash (y otras imágenes y lo que no son actualizados cuando hay un cambio a 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 guarde en caché.

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

+0

https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching (bueno en general) –

Respuesta

621

Son ligeramente diferentes: ETag no tiene ninguna información que el cliente pueda usar para determinar si se va a volver a solicitar o no 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 suma 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.

Así que lo que realmente quiere hacer es usar AMBAS cabeceras: establezca el encabezado Vence 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 carga equilibrada 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.

+36

Esta respuesta acaba de hacer mi día. Hemos estado luchando con la pregunta etag porque ni los desarrolladores ni el gerente de TI (que estaba pidiendo agregar etags) podrían explicar completamente los casos de uso. ¡Gracias! –

+52

Mi trabajo aquí está hecho. :) –

+8

También debe verificar si debe usar Cache-Control en lugar de Expires. Según tengo entendido, Cache-Control se introdujo después de Expira y le da más control. Consulte http://stackoverflow.com/questions/5799906/whats-the-difference-between-expires-and-cache-control-headers –

19

Por defecto, Apache generará un Etag based on el número de inodo del archivo, fecha de última modificación, y tamaño, lo cual debería estar perfectamente bien para hacer lo que quieras. 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 deba enviar Apache 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 almacenable en caché. Eche un vistazo al mod_expires para configurar eso.

+0

Por lo tanto, ETag tendrá la última modificación y el encabezado de caducidad indicará que quiero que guarde en caché y cuando lo cargue y sobrescriba mi archivo, simplemente lo bajarán al caché del usuario; de lo contrario, se generaría un 304, ¿no? – GeoffreyF67

+0

El Etag depende de manera complicada en la fecha de la última modificación; pero cuando modificas el archivo, el Etag cambiará. Entonces, el Etag enviado por el navegador (para su versión en caché del archivo) no coincidirá con el Etag del archivo en el servidor, y Apache enviará el archivo en lugar de una respuesta 304. –

+5

¿No vence el encabezado de un año para indicarle al cliente que ni siquiera verifique una nueva versión por un año? –

97

Etag y de última modificación cabeceras son validadores.

Ayudan al navegador y/o la memoria caché (proxy inverso) a entender 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 al navegador y al reverso de los proxies intermedios, hasta qué momento o durante cuánto tiempo, pueden mantener la página/archivo en su caché.

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

26

Expires y Cache-Control son "fuertes cabeceras de caché"

Last-Modified y ETag son "encabezados de caché débiles"

En primer lugar la comprobación del navegador Expires/Cache-Control para determinar si debe o no hacer una petición al servidor

Si tiene que realizar una solicitud, enviará Last-Modified/ETag en la solicitud HTTP. Si el valor 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é.

+0

¿considera que algún documento admite el comportamiento de almacenamiento en caché "fuerte y débil"? No pude encontrar uno, y el navegador de mi cliente ahora prioriza la última modificación que expira en realidad, lo cual no entiendo por qué. – GMsoF

+1

@GMsoF Es posible que desee echar un vistazo a esto: http://tools.ietf.org/html/rfc7232#section-2.1 – Medeiros

+0

Entonces, si quiero asegurarme de que mis cambios se propaguen al cliente de inmediato, pero aún me beneficia algo del almacenamiento en caché, solo puedo usar Last-Modified y ETag ¿verdad? –

10

Otro Resumen:

Usted necesita usar ambos. ETags son una información del "lado del servidor". Los vencimientos son un caché "del lado del cliente".

  • Uso ETags, excepto si tiene un servidor de equilibrio de carga. 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.

  • Expira deben utilizarse con precaución, ya que si se establece una fecha de caducidad muy lejos en el futuro, pero desea cambiar uno de los archivos immediatelly (un archivo JS, por ejemplo), algunos usuarios pueden no obtener la versión modificada hasta mucho tiempo!

+0

En caso de que esto ocurra, básicamente necesita cambiar el nombre de su js y cambiarlo en su HTML, y espero que no haya establecido que el archivo HTML caduque también 1 año. – EralpB

0

Una cosa adicional quisiera mencionar que algunas de las respuestas pueden haber perdido es la desventaja de tener tanto ETags y Expires/Cache-control en sus cabeceras.

Dependiendo de sus necesidades, solo puede agregar bytes adicionales en sus encabezados, lo que puede aumentar 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 ello en este excelente post del blog de Kyle Simpson: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

1

En mi opinión, con Expira cabecera, el servidor puede decirle al cliente cuando mis datos serían rancio, mientras que con Etag, el servidor lo haría verifique el valor de etag para cada solicitud del cliente.