304 not modified

Si se modifica desde

Estoy ejecutando un servidor web Apache, sirviendo grandes imágenes estáticas del sistema de archivos. He configurado el servidor para que devuelva una cabecera de caché válida, así Header merge Cache-Control «public, max-age=31536000, immutable»

He leído la Guía de Almacenamiento en Caché de Apache, pero nada de ello parece relevante para esta situación… todo se refiere a la configuración de la propia caché de Apache, ya sea en memoria o en disco, especialmente para soportar casos en los que Apache está sirviendo como proxy inverso para un servidor de origen.

Pero en este caso, los ficheros ya están en el disco local. No hay servidor de origen. No quiero/necesito que Apache almacene una copia «cacheada» separada del archivo; sólo quiero que Apache se dé cuenta de que la fecha de Última Modificación del archivo en el disco coincide con la fecha de If-Modified-Since y devuelva 304 Not Modified en ese caso.

¿Cómo puedo configurar esto? ¿Tengo que hacer que Apache almacene su propia copia en caché de los archivos para poder hacer GETs condicionales? (Eso será un caché muy grande, presumiblemente almacenado en el disco, lo que es un total desperdicio).

Códigos de estado Http

Un mensaje 304 Not Modified es un código de estado de respuesta HTTP que indica que el recurso solicitado no ha sido modificado desde la transmisión anterior, por lo que no es necesario retransmitir el recurso solicitado al cliente. En efecto, un código de respuesta 304 Not Modified actúa como una redirección implícita a una versión en caché del recurso solicitado.

A menudo puede ser un reto distinguir entre todos los posibles códigos de respuesta HTTP y determinar la causa exacta de errores como el código 304 No Modificado. Hay docenas de posibles códigos de estado HTTP utilizados para representar la compleja relación entre el cliente, una aplicación web, un servidor web y la multitud de servicios web de terceros que pueden estar en uso, por lo que determinar la causa de un código de estado particular puede ser un reto. En este artículo examinaremos el código 304 No Modificado, viendo algunos consejos para la solución de problemas, junto con algunas soluciones potenciales para problemas comunes que podrían estar causando este problema dentro de sus propias aplicaciones web, así que ¡vamos a ello!

Frasco 304

En este ejemplo, el cliente intenta renderizar un archivo PNG. Como no hay ninguna cabecera If-Modified-Since o If-None-Match presente, el servidor sabe que esta es la primera petición de esta imagen. Veremos cada una de las opciones del servidor en la siguiente sección.

Tras recibir la respuesta del servidor, el cliente almacena esta imagen y el valor de la cabecera Last-Modified en la caché. Con esta información, el cliente puede interrogar al servidor con el valor de la cabecera If-Modified-Since en futuras peticiones. Supongamos que un usuario acaba de pulsar F5 para recargar la página, la segunda petición a la misma imagen será:

Ahora el servidor comprobará si esta imagen ha sido editada desde Thu, 15 Sep 2015 22:10:34 GMT. Si la respuesta es afirmativa, el servidor puede tratar esta petición como una normal y actualiza el valor de la cabecera Last-Modified con la fecha de la última modificación. Y si la respuesta es negativa, la respuesta será muy sencilla:

En la segunda opción, el servidor da un identificador único que representa el último cambio de esta imagen. Como el formato del valor ETag no está estrictamente definido en HTTP 1.1, en este ejemplo utilizamos el GUID. (Además, el método de generación del valor ETag no importa. Lo que importa es si el servidor puede reconocer el cambio que hay detrás).

304 respuesta

Si el cliente ha realizado una petición GET condicional y se permite el acceso sin que se modifique el documento, el servidor DEBERÍA responder con este código de estado. La respuesta 304 NO DEBE contener un cuerpo de mensaje, por lo que siempre termina con la primera línea vacía después de los campos de cabecera.

– Fecha, a menos que su omisión sea requerida por [RFC 2068], sección 14.18.1 Si un servidor de origen sin reloj obedece estas reglas y proxies y si los clientes añaden su propia Fecha a cualquier respuesta recibida sin ella (como ya se especifica en [RFC 2068], sección 14.19), las cachés funcionarán correctamente.

Si el GET condicional utilizó un validador de caché fuerte (véase [RFC 2068], sección 13.3.3), la respuesta NO DEBERÍA incluir otras cabeceras de entidad. En caso contrario (es decir, si el GET condicional utilizó un validador débil), la respuesta NO DEBE incluir otras cabeceras de entidad; esto evita inconsistencias entre los cuerpos de entidad almacenados en caché y las cabeceras actualizadas.