html - para - ¿Las respuestas HTTP 304 no modificadas contienen encabezados de control de caché?
http response example (3)
Intenté entender esto y busqué SO para preguntas similares, pero todavía no entiendo al 100% cómo se supone que funciona.
Recibo esta respuesta cuando solicito un recurso de imagen:
Response Headers
Server Apache-Coyote/1.1
Date Mon, 19 Oct 2009 09:04:04 GMT
Expires Mon, 19 Oct 2009 09:06:05 GMT
Cache-Control public, max-age=120
Etag image_a70703fb393a60b6da346c112715a0abd54a3236
Content-Disposition inline;filename="binary-216-420"
Content-Type image/jpg;charset=UTF-8
Content-Length 4719
El comportamiento deseado es que el cliente lo guarde en caché durante 120 segundos, luego lo solicite nuevamente al servidor. Dentro de los 120 segundos, no se envía ninguna solicitud al servidor.
Luego, después de 120 segundos, se envía una solicitud y se recibe una respuesta 304:
Response Headers
Server Apache-Coyote/1.1
Date Mon, 19 Oct 2009 09:06:13 GMT
Request Headers
Host localhost:8080
User-Agent Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
Accept image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language en-us,no;q=0.8,sq;q=0.7,en;q=0.5,sv;q=0.3,nn;q=0.2
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
Connection keep-alive
Referer http://localhost:8080/cms/site/0/en/home
Cookie JSESSIONID=768ABBE1A3BFABE3B535900233330650; versionsCssDisplayState=block; iceInfo=iceOn:false,activePortletKey:,icePagePanelX:1722,icePagePanelY:3
If-None-Match image_a70703fb393a60b6da346c112715a0abd54a3236
Hasta ahora, todo bien. Pero luego, en la siguiente solicitud (dentro de 120 segundos), habría pensado que el recurso debería almacenarse en caché durante 120 segundos nuevos. Lo que veo en el navegador (Firefox), por otro lado, es que a partir de este momento siempre solicita el recurso y recibe la respuesta 304.
¿Se supone que debo adjuntar los encabezados de control de caché en la respuesta 304? Por lo que puedo leer en la especificación, parece que la configuración de control de caché debe omitirse, y que la memoria caché debe almacenarla en caché durante 120 segundos nuevos automáticamente?
Si entiendo correctamente, entonces el navegador está de hecho almacenando en caché por 120 segundos y su servidor está respondiendo 304 No modificado a posteriores peticiones If-Modified-Since. Esta solicitud de "IMS" ocurre cuando el usuario final accede a la misma URL. En ese momento, el navegador puede enviar una solicitud If-Modified-Since. El navegador quiere saber si muestra contenido obsoleto. Esto parece normal.
Al recibir esta solicitud, su servidor debe responder 200 OK, 304 Not Modified (o 4XX, si es necesario).
No creo que deba configurar su servidor para enviar un encabezado Cache-Control con la respuesta 304 por dos razones:
1. No desea que los cachés intermedios guarden en caché esa respuesta 304 (existe la posibilidad de que puedan)
2. El TTL de 120 segundos no se actualizará con la respuesta 304. El navegador retendrá el objeto durante 120 segundos a partir de la respuesta 200 OK. Después de 120 segundos, el navegador debe enviar una solicitud GET, no un If-Modified-Since, por lo que su servidor responderá con los bytes del archivo y no solo con una respuesta 304.
Tenga en cuenta que el navegador no volverá a solicitar el archivo automáticamente después de 120 segundos, a menos que el usuario lo solicite específicamente mediante una carga de página o directamente ingresando la URL en su barra de direcciones (o a menos que tenga una aplicación personalizada que controle esa funcionalidad de alguna manera).
Editado el primer párrafo para leer un poco mejor (con suerte)
En teoría, no debería tener que enviar Cache-Control para un 304; el destinatario debería seguir utilizando las directivas de caché que recibió del 200 original. Sin embargo, como ha descubierto, en la práctica si no lo hace siga enviando Cache-Control, los navegadores ignorarán las directivas de caché que envió originalmente y volverán a su heurística predeterminada.
En la práctica, debe incluir el mismo Cache-Control con un 304 que con un 200. La especificación solo exige que lo envíe a un 304 si es diferente de lo que envió anteriormente (consulte 10.3.5 304 No modificado ) - pero ciertamente no te prohíbe repetirlo cuando es lo mismo.
Y para responder específicamente a los puntos equivocados de la otra respuesta (Estructura):
Desea que los cachés intermedios guarden en caché la respuesta (es decir, actualicen su entrada de caché para el recurso). Responderán adecuadamente a las solicitudes de los clientes con un 200 o un 304, dependiendo de si el cliente incluye un encabezado condicional como If-Modified-Since.
El 304 actualizará el ttl de 120 segundos (por lo que el mismo cliente no debe realizar otra solicitud para el mismo recurso durante al menos otros 120 segundos). Y los clientes, mientras sigan teniendo el contenido almacenado en la memoria caché, continuarán realizando solicitudes condicionales para el recurso, al cual pueden continuar respondiendo con un 304.
RFC7232 actualiza RFC2616 para decir:
El servidor que genera una respuesta 304 DEBE generar cualquiera de los siguientes campos de encabezado que se enviarían en una respuesta 200 (OK) a la misma solicitud: Control de caché, Ubicación de contenido, Fecha, ETag, Vencimiento y Variar.