He mirado 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 intento hacer es asegurarme de que mis archivos flash (y otras imágenes y lo que no solo se actualizan 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 caché.
Además, ¿hay algo que deba hacer programáticamente en mis scripts PHP para admitir esto o es todo Apache?
http
caching
etag
expires-header
GeoffreyF67
fuente
fuente
Respuestas:
Son ligeramente diferentes: el ETag no tiene ninguna información que el cliente pueda usar para determinar si volverá a hacer una solicitud para 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 debe enviar el archivo (HTTP 200) o decirle 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 encabezado Expires es utilizado por el cliente (y servidores proxy / cachés) para determinar si incluso necesita realizar una solicitud al servidor. Cuanto más cerca esté de la fecha de caducidad, es más probable que el cliente (o proxy) realice una solicitud HTTP para ese archivo desde el servidor.
Entonces, lo que realmente quiere hacer es usar AMBOS encabezados: establezca el encabezado Expira en un valor razonable en función de la frecuencia con la que cambia el contenido. Luego configure ETags para que se envíen de modo que cuando los clientes envíen una solicitud al servidor, pueda determinar más fácilmente si se debe enviar o no el archivo.
Una última nota sobre ETag: si está utilizando una configuración de servidor con equilibrio de carga con varias máquinas que ejecutan Apache, es probable que desee desactivar la generación de ETag. Esto se debe a que los inodes se usan como parte del algoritmo hash ETag, que será diferente entre los servidores. Puede configurar Apache para que no use inodes 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 la misma ETag para todos los servidores.
fuente
Los encabezados Etag y 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.
Expires y Cache-control están dando información de actualización .
Esto significa que informan, el navegador y los proxies intermedios inversos, hasta qué hora o durante cuánto tiempo, pueden mantener la página / archivo en su caché.
Entonces, la pregunta generalmente es cuál validador usar, etag o última modificación, y qué encabezado de información de actualización usar, caduca o control de caché.
fuente
Expires
yCache-Control
son "fuertes encabezados de almacenamiento en caché"Last-Modified
yETag
son "encabezados de almacenamiento en caché débiles"Primero, la verificación del navegador
Expires/Cache-Control
para determinar si realizar o no una solicitud al servidorSi tiene que hacer una solicitud, enviará
Last-Modified/ETag
la solicitud HTTP. Si elEtag
valor del documento coincide con eso, el servidor enviará un código 304 en lugar de 200, y ningún contenido. El navegador cargará el contenido de su caché.fuente
Por defecto, Apache generará un Etag basado en el número de inodo del archivo, la fecha de la última modificación y el tamaño, lo que debería estar perfectamente bien para hacer lo que desea. Creo que también generará por defecto un encabezado de Última modificación basado en la última hora de modificación del archivo en el disco, que también está perfectamente bien para hacer lo que desee.
Probablemente también debería hacer que Apache envíe un encabezado Expires con fecha de un año en el futuro (de acuerdo con http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ) para que los navegadores sepan que el contenido es almacenable en caché Echa un vistazo a mod_expires para configurar eso.
fuente
Otro resumen:
Necesitas usar ambos. Los ETag son información del "lado del servidor". Los vencimientos son un almacenamiento en caché del "lado del cliente".
Use ETags, excepto si tiene un servidor con equilibrio de carga. Son seguros y les permitirán a los clientes saber que deben obtener nuevas versiones de los archivos de su servidor cada vez que cambie algo de su lado.
Los vencimientos deben usarse con precaución, ya que si establece una fecha de vencimiento en el futuro pero quiere cambiar uno de los archivos inmediatamente (un archivo JS por ejemplo), ¡algunos usuarios pueden no obtener la versión modificada hasta mucho tiempo!
fuente
Una cosa adicional que me gustaría mencionar que algunas de las respuestas pueden haberse perdido es la desventaja de tener ambas
ETags
yExpires/Cache-control
en sus encabezados.Dependiendo de sus necesidades, 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 la sobrecarga de tener ambas cosas en sus encabezados es necesaria o si solo agregará un peso adicional en sus solicitudes, lo que reduce el rendimiento.
Puede leer más al respecto en esta excelente publicación de blog de Kyle Simpson: http://calendar.perfplanet.com/2010/bloated-request-response-headers/
fuente
En mi opinión, con el encabezado de caducidad, el servidor puede decirle al cliente cuándo mis datos estarán obsoletos, mientras que con Etag, el servidor verificará el valor de etag para cada solicitud del cliente.
fuente
ETag se usa para determinar si un recurso debe usar la copia uno. y vence el encabezado como Cache-Control le dice al cliente que antes de las décadas de caché, el cliente debería buscar el recurso local.
En los sitios modernos, a menudo se ofrece un archivo llamado hash, como
app.98a3cf23.js
, por lo que es una buena práctica usar Expires Header. Además de esto, también reduce el costo de la red.Espero eso ayude ;)
fuente