apache - vencimiento - excel control de fechas
Control de vencimiento de caché con la última modificación (4)
Una directiva Expires*
con "modificación" ya que su base se refiere a la hora de modificación del archivo en el servidor. Por lo tanto, si establece, por ejemplo, "modificación más 2 horas", cualquier navegador que solicite contenido dentro de las 2 horas posteriores a la modificación del archivo (en el servidor) almacenará dicho contenido en caché hasta 2 horas después de la hora de modificación del archivo. Y el navegador sabe cuándo se debe a que el servidor envía un encabezado Expires
con el tiempo de vencimiento correcto.
Déjame explicarte con un ejemplo: di que tu configuración de Apache incluye la línea
ExpiresDefault modification plus 2 hours
y tiene un archivo index.html
, al que se aplica la directiva ExpiresDefault
, en el servidor. Supongamos que carga una versión de index.html
a las 9:53 GMT, sobrescribiendo el anterior index.html
existente (si lo hubiera). Entonces, ahora el tiempo de modificación de index.html
es 9:53 GMT. Si estuviera ejecutando ls -l
en el servidor (o dir
en Windows), lo vería en la lista:
-rw-r--r-- 1 apache apache 4096 Feb 18 09:53 index.html
Ahora, con cada solicitud, Apache envía el encabezado Last-Modified
con la última hora de modificación del archivo. Como tiene esa directiva ExpiresDefault
, también enviará el encabezado Expires
con un tiempo igual al tiempo de modificación del archivo (9:53) más dos horas. Entonces, esto es parte de lo que ve el navegador:
Last-Modified: Wed, 18 Feb 2009 09:53:00 GMT
Expires: Wed, 18 Feb 2009 11:53:00 GMT
Si la hora en que el navegador realiza esta solicitud es antes de las 11:53 GMT, el navegador guardará en la memoria caché de la página, porque aún no ha expirado. Entonces, si el usuario visita por primera vez la página a las 11:00 GMT y luego vuelve a la misma página a las 11:30 GMT, el navegador verá que su versión almacenada en caché sigue siendo válida y no (o, mejor dicho, está permitida). ) hacer una nueva solicitud HTTP.
Si el usuario va a la página una tercera vez a las 12:00 GMT, el navegador ve que su versión en caché ha expirado (es después de 11:53), por lo que intenta validar la página, enviando una solicitud al servidor con un If -Modificado-Desde encabezado. Se devolverá una respuesta 304 (no modificada) sin cuerpo ya que la fecha de la página no se ha modificado desde la primera vez que se atendió. Dado que la fecha de caducidad ha pasado, la página está "obsoleta", se realizará una solicitud de validación cada vez que se visite la página hasta que falle la validación.
Ahora, imaginemos que cargó una nueva versión de la página a las 11:57. En este caso, el intento del navegador de validar la versión anterior de la página a las 12:00 falla y recibe en la respuesta, junto con la nueva página, estos dos nuevos encabezados:
Last-Modified: Wed, 18 Feb 2009 11:57:00 GMT
Expires: Wed, 18 Feb 2009 13:57:00 GMT
(La última hora de modificación del archivo pasa a ser 11:57 al cargarse la nueva versión, y Apache calcula el tiempo de caducidad como 11:57 + 2:00 = 13:57 GMT).
La validación (usando la fecha más reciente) no será requerida ahora hasta las 13:57.
(Nótese, por supuesto, que se envían muchas otras cosas junto con los dos encabezados que enumeré arriba, simplemente recorté todo el resto para simplificar)
En el módulo mod_expires
de Apache, existe la directiva Expires
con dos períodos de tiempo base, acceso y modificación .
ExpiresByType text/html "access plus 30 days"
comprensiblemente significa que la caché solicitará contenido nuevo después de 30 días.
Sin embargo,
ExpiresByType text/html "modification plus 2 hours"
no tiene sentido intuitivo
El caché del navegador sabe que el archivo ha sido modificado a menos que haga una solicitud al servidor. Y si está haciendo una llamada al servidor, ¿para qué sirve almacenar en caché esta directiva? Me parece que no entiendo una parte crucial del almacenamiento en caché. Por favor iluminame.
El servidor envía un encabezado como: " Last-Modified: Wed, 18 Feb 2009 00:00:00 GMT
". La memoria caché se comporta en función de este encabezado o del tiempo de acceso.
Digamos que si se espera que el contenido se actualice todos los días, entonces quiere que caduque "modificación más 24 horas".
Si no sabe cuándo se actualizará el contenido, entonces es mejor basarlo en el tiempo de acceso.
Según tengo entendido, la modificación le pide al navegador que base el tiempo de caché según el valor del encabezado HTTP Last-Modificatied. Entonces, la modificación más 2 horas sería el tiempo de Última Modificación + 2 horas.
En primer lugar, gracias a David Z por la explicación detallada anterior. En respuesta a la pregunta de bosquimano sobre por qué tiene sentido invocar el almacenamiento en caché si el servidor todavía está obligado a realizar una solicitud, la respuesta es que el tiempo se guarda en lo que devuelve el servidor. Si las directivas de caché indican que el contenido de un archivo aún está actualizado, en lugar de devolver el contenido, se devuelve un código 304 con un cuerpo de respuesta vacío. Ahí es donde se guarda el tiempo.
Una mejor explicación de la que he dado está aquí, desde https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers :
Aunque las solicitudes condicionales invocan una llamada a través de la red, los recursos no modificados generan un cuerpo de respuesta vacío, lo que ahorra el costo de transferir el recurso al cliente final. El servicio de backend a menudo también puede determinar muy rápidamente la última fecha de modificación de un recurso sin acceder al recurso, que a su vez ahorra un tiempo de procesamiento no trivial.
Basado en tiempo
Una solicitud condicional basada en el tiempo asegura que solo se transferirá el contenido si el recurso solicitado ha cambiado desde que la copia del navegador fue almacenada en caché. Si la copia en caché es la más actualizada, el servidor devuelve el código de respuesta 304.
Para habilitar las solicitudes condicionales, la aplicación especifica la última hora modificada de un recurso a través del encabezado de respuesta Last-Modified.
Cache-Control: public, max-age = 31536000 Última modificación: Mon, 03 Jan 2011 17:45:57 GMT
La próxima vez que el navegador solicite este recurso, solo solicitará los contenidos del recurso si no han cambiado desde esa fecha utilizando el encabezado de solicitud If-Modified-Since.
Si-Modificado-Desde: lunes, 03 de enero de 2011 17:45:57 GMT
Si el recurso no ha cambiado desde el lunes, 03 de enero de 2011 17:45:57 GMT, el servidor volverá con un cuerpo vacío con el código de respuesta 304.