Estoy tratando de tener un comportamiento básico con respecto a mi estrategia de almacenamiento en caché: los archivos deben almacenarse en caché y revalidarse con el servidor cada vez. Así que me gustaría que Apache enviara un 304 de regreso.
Aquí está el diálogo que ocurre para cada actualización del navegador:
Status Code:200 OK
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:max-age=0
Connection:keep-alive
Cookie: ...
Host:...
If-Modified-Since:Tue, 14 Oct 2014 15:10:37 GMT
If-None-Match:"1461-505636af08fcd-gzip"
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36
Response Headers
Accept-Ranges:bytes
Cache-Control:No-cache
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:1412
Content-Type:text/html
Date:Tue, 14 Oct 2014 16:58:05 GMT
ETag:"1461-505636af08fcd-gzip"
Keep-Alive:timeout=5, max=99
Last-Modified:Tue, 14 Oct 2014 15:10:37 GMT
Server:Apache/2.4.6 (Ubuntu)
Vary:Accept-Encoding
(Esto es de Chrome Devtools, con Deshabilitar caché desmarcado)
Puede ver que la respuesta contiene Cache-Control: Encabezado sin caché, y que el encabezado If-modified-since coincide con Last-modified. El ETag también coincide.
¿No debería Apache enviar un 304 en ese caso?
EDITAR
Deshabilitar ETags en apache con
Header unset ETag
hace que el comportamiento de almacenamiento en caché sea más predecible ...
Cache-Control:max-age=0
deshabilitó el caché, así que ves laCache-Control:No-cache
respuesta.Respuestas:
Esto parece ser un error viejo , que explica por qué
Header unset ETag
hace la diferencia.Apache 2.4.0+ agrega automáticamente el nombre del método de compresión al ETag (como se ve en sus encabezados), y evita una respuesta 304.
Las versiones más recientes de mod_deflate admiten un DeflateAlterETag que se puede usar para controlar este comportamiento:
fuente
DeflateAlterETag Remove
opción para hacer exactamente esoEste se destaca en la solicitud como un poco extraño:
Sin embargo, es probable que sea más importante, noto que el contenido devuelto es html. ¿Se está generando dinámicamente? Apache PUEDE enviar una respuesta 304, pero a menos que esté sirviendo contenido estático, no es el trabajo de Apache hacer esa llamada, y todo se reduce a la lógica de su aplicación. Por ejemplo, la mayoría de las aplicaciones php tienen soporte limitado para tales cosas.
Una caché de front-end puede ayudar, ya que la aplicación de almacenamiento en caché puede verificar el tiempo de modificación, etag, etc., pero solo si la aplicación y los encabezados de solicitud son compatibles con la caché. Por ejemplo, la aplicación debe establecer encabezados apropiados para indicar que el contenido se puede almacenar en caché, y cosas como el encabezado de control de caché en su solicitud negarán el caché. Sus encabezados no se ven amigables con el caché.
fuente
Si tiene Apache configurado con
Cache-Control:No-cache
, Apache nunca enviará un mensajeHTTP 304 Not modified
al cliente.Si desea revalidar algunas solicitudes, coloque
Cache-Control:No-cache
solo en las páginas donde lo necesite. No necesita revalidar todos los recursos, y está desperdiciando ancho de banda al hacerlo.fuente