mod_expires htaccess enable control cache http apache-config etag mod-expires

http - enable - apache cache control htaccess



ETag vs Header Vence (7)

He mirado a mi alrededor pero no he podido averiguar si debería usar tanto un ETag como 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 no solo se actualicen cuando haya 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 mi extremo en mis scripts PHP para admitir esto o es todo Apache?


De forma predeterminada, 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 quiera. Creo que también generará por defecto un encabezado de última modificación basado en la última modificación del archivo en el disco, lo que también es perfectamente correcto hacer lo que se desea.

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 cacheable Echa un vistazo a mod_expires para configurar eso.


En mi opinión, con el encabezado de expiración, el servidor puede decirle al cliente cuando mis datos estarán obsoletos, mientras que con Etag, el servidor verificará el valor de etag para cada solicitud del cliente.


Otro resumen:

Necesitas usar ambos. ETags son una información del "lado del servidor". Los vencimientos son un "lado del cliente" de almacenamiento en caché.

  • Utilice ETags, excepto si tiene un servidor de carga equilibrada. Son seguros y le informarán a los clientes 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 desea cambiar uno de los archivos inmediatamente (un archivo JS, por ejemplo), ¡es posible que algunos usuarios no obtengan la versión modificada hasta mucho tiempo!


Son ligeramente diferentes: el ETag no tiene ninguna información que el cliente pueda usar para determinar si debe o no volver a solicitar 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 enviar el archivo (HTTP 200) o decirle al cliente que solo use su copia local (HTTP 304). Una ETag es básicamente 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 los proxies / cachés) para determinar si es necesario 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 proxy) realice una solicitud HTTP para ese archivo desde el servidor.

Entonces, lo que realmente quiere hacer es usar AMBOS encabezados: establezca el encabezado Vencimientos en un valor razonable según la frecuencia con la que cambie 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 enviar o no el archivo de vuelta.

Una última nota sobre ETag: si está utilizando una configuración de servidor de carga equilibrada con varias máquinas que ejecutan Apache, es probable que desee 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 iguales, para garantizar que se genere la misma ETag para todos los servidores.


Una cosa adicional que me gustaría mencionar que algunas de las respuestas pueden haberse perdido es la desventaja de tener ETags y Expires/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, debe ver si la sobrecarga de tener ambas cosas en sus encabezados es necesaria o simplemente agregará más peso en sus solicitudes, lo que reduce el rendimiento.

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


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

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

Primero, el navegador comprueba Expires/Cache-Control para determinar si se debe realizar una solicitud 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 no habrá contenido. El navegador cargará los contenidos desde su caché.


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 el reverso entre los proxies, hasta qué hora o por cuánto tiempo, pueden mantener la página / archivo en su caché.

Entonces, la pregunta generalmente es qué validador usar, etag o última modificación, y qué actualización del encabezado de información usar, caduca o caché-control.