http - descargar - qgis español
HTTP: Combinando la caché de expiración y validación (1)
Tengo problemas para formular encabezados de caché HTTP para la siguiente situación.
Nuestro servidor tiene gran cantidad de datos que cambian quizás un par de veces a la semana. Quiero que los navegadores guarden estos datos. Además, quiero minimizar la latencia de las transferencias condicionales ya que la red no es confiable.
El comportamiento final que busco es este:
- El cliente solicita un recurso que no ha visto antes.
- El servidor responde con recursos junto con ETag y
max-age
(24 horas). - Hasta que pasen 24 horas, el cliente utilizará el recurso en caché.
- Después de la fecha de vencimiento, el cliente realizará una solicitud de validación (
If-None-Match: [etag]
) - Si el recurso no ha cambiado:
- el servidor responde con
304 Not Modified
- Se informa de alguna manera al cliente que el recurso existente tiene una nueva fecha de vencimiento dentro de 24 horas.
- volver al paso 3
- el servidor responde con
Reducido a su esencia ... ¿puede una respuesta 304 contener una nueva max-age
? ¿O se max-age
original para solicitudes posteriores?
Sí, una respuesta 304 puede contener un nuevo max-age
(o ETag, u otros encabezados de respuesta).
Hice un experimento con Firefox 4 para probar si se respetaba el max-age original o el nuevo, y la respuesta fue que se respetaba el nuevo max-age
, por lo que deberías poder implementar lo que quieras hacer.
Es importante recordar que max-age
es relativa al encabezado de respuesta de la Date
, no a Last-Modified
, por lo que cada vez que su servidor establece una directiva de max-age
de 24 horas, dice "24 horas desde ahora". Entonces, asumiendo que eso es lo que quiere, no tendrá que cambiar su max-age
en absoluto, siempre devuelva 86400.
De todos modos, aquí hay un resumen y volcado de mi experimento. Básicamente, llego a una URL de prueba que establece un ETag y establece max-age
en 120 segundos. En consecuencia, el servidor devolvió la página con estos encabezados de respuesta:
HTTP/1.1 200 OK
Date: Tue, 14 Jun 2011 23:48:51 GMT
Cache-Control: max-age=120
Etag: "901ea3d0ac9303ae4855a09676f96701"
Last-Modified: Mon, 13 Jun 2011 22:20:03 GMT
Luego repetí presionando "enter" en la barra de direcciones para cargar la página (pero no forzar una recarga difícil). No hubo tráfico en la red, ya que Firefox recargó repetidamente la página desde el caché. Luego, después de 120 segundos, la próxima vez que presioné Enter, Firefox envió un GET condicional al servidor, como era de esperar. La solicitud y respuesta del servidor fueron:
GET /example HTTP/1.1
If-Modified-Since: Mon, 13 Jun 2011 22:20:03 GMT
If-None-Match: "901ea3d0ac9303ae4855a09676f96701"
HTTP/1.1 304 Not Modified
Date: Tue, 14 Jun 2011 23:50:54 GMT
Etag: "901ea3d0ac9303ae4855a09676f96701"
Cache-Control: max-age=240
Tenga en cuenta que en la respuesta 304, el servidor ha cambiado max-age
de 120 segundos a 240.
Entonces, la gran pregunta es, ¿qué pasaría después de 120 segundos? ¿Respetaría Firefox el nuevo max-age
y continuaría cargando la página desde el caché, o afectaría al servidor? La respuesta es que continuó cargando la página desde el caché y no volvió a solicitar hasta que se alcanzaron los 240 segundos:
GET /example HTTP/1.1
If-Modified-Since: Mon, 13 Jun 2011 22:20:03 GMT
If-None-Match: "901ea3d0ac9303ae4855a09676f96701"
HTTP/1.1 304 Not Modified
Date: Tue, 14 Jun 2011 23:54:56 GMT
Etag: "901ea3d0ac9303ae4855a09676f96701"
Cache-Control: max-age=240
Repetí durante otro ciclo de 240 segundos y las cosas funcionaron como cabría esperar. Así que, espero que eso responda la pregunta por ti.
El RFC explica cómo se deben implementar los cálculos de edad y cómo funcionan los otros parámetros de Cache-Control. No hay garantía de que todos los navegadores y proxy sigan las reglas, pero en este punto, HTTP 1.1 es bastante antiguo y es de esperar que la mayoría de ellos lo hagan igual que Firefox.
( Nota: para mayor brevedad en estos volcados de ejemplo, he eliminado encabezados irrelevantes como host, conexión / mantener en funcionamiento, codificación / longitud / tipo de contenido, agente de usuario, etc.)