values htaccess control cache age google-chrome amazon-s3 http-headers amazon-cloudfront cache-control

google chrome - htaccess - ¿Por qué el navegador aún envía solicitudes de público de control de caché con max-age?



cache-control html5 (4)

Tengo objetos de Amazon S3, y para cada objeto, he establecido

Cache-Control: public, max-age=3600000

Eso es aproximadamente 41 días.

Y tengo Amazon CloudFront Distribution configurado con Minimum TTL también con 3600000.

Esta es la primera solicitud después de borrar el caché.

GET /1.0.8/web-atoms.js HTTP/1.1 Host: d3bhjcyci8s9i2.cloudfront.net Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8

Y la respuesta es

HTTP/1.1 200 OK Content-Type: application/x-javascript Content-Length: 226802 Connection: keep-alive Date: Wed, 28 Aug 2013 10:37:38 GMT Cache-Control: public, max-age=3600000 Last-Modified: Wed, 28 Aug 2013 10:36:42 GMT ETag: "124752e0d85461a16e76fbdef2e84fb9" Accept-Ranges: bytes Server: AmazonS3 Age: 342557 Via: 1.0 6eb330235ca3971f6142a5f789cbc988.cloudfront.net (CloudFront) X-Cache: Hit from cloudfront X-Amz-Cf-Id: 92Q2uDA4KizhPk4TludKpwP6Q6uEaKRV0ls9P_TIr11c8GQpTuSfhw==

Aunque Amazon claramente envía Cache-Control, Chrome aún realiza una segunda solicitud en lugar de leerla desde Cache.

GET /1.0.8/web-atoms.js HTTP/1.1 Host: d3bhjcyci8s9i2.cloudfront.net Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 If-None-Match: "124752e0d85461a16e76fbdef2e84fb9" If-Modified-Since: Wed, 28 Aug 2013 10:36:42 GMT

Pregunta: ¿Por qué Chrome hace una segunda solicitud?

Caduca Este comportamiento cambia cuando coloco un atributo Expires explícito en los encabezados. El navegador no enviará una solicitud subsiguiente para el encabezado Expira, pero para el público de control de memoria caché, lo envía. Mis objetos S3 nunca cambiarán, son inmutables, cuando cambiamos el archivo, los ponemos como un objeto nuevo con una nueva URL.

En el Script de la Página de Referencia, Chrome hace solicitudes subsiguientes solo algunas veces, hice esta prueba al escribir la URL en el navegador. Cuando se hace referencia a una secuencia de comandos mediante una página HTML, en el caso de algunas solicitudes posteriores, Chrome carga las secuencias de comandos almacenadas en caché, pero una vez más después de algún tiempo, de vez en cuando envía una solicitud al servidor. No hay problema de tamaño de disco aquí, Chrome tiene suficiente espacio de caché.

El problema es que nos cobran por cada solicitud, y quiero que los objetos S3 se almacenen en caché para siempre, y deben cargarse desde la memoria caché y nunca deben conectarse al servidor nuevamente.


Cuando presiona F5 en Chrome, siempre enviará solicitudes al servidor. Estos se harán con el encabezado Cache-Control:max-age=0 . El servidor generalmente responderá con un código de estado 304 (No modificado).

Cuando presiona Ctrl + F5 o Mayús + F5 , se realizan las mismas solicitudes, pero con el encabezado Cache-Control:no-cache , lo que obliga al servidor a enviar una versión no almacenada, generalmente con un código de estado 200 (OK).

Si quiere asegurarse de que está utilizando la caché del navegador local, simplemente presione Entrar en la barra de direcciones.


Si Chrome Developer Tools está abierto (F12), Chrome generalmente desactiva el almacenamiento en caché.

Se puede controlar en la configuración de herramientas del desarrollador: el icono de engranaje a la derecha de la barra superior de herramientas de desarrollo.


Si está presionando el botón Actualizar para cargar la página o recurso en particular, la solicitud de encabezado if-modified-since se envía cada vez, si en cambio solicita la página / recurso como una solicitud separada en una pestaña nueva o mediante un enlace en un script o página html, cargará la página / recurso del caché del navegador.

Esto es lo que ha sucedido en mi caso, puede ser este es el caso general universal. No estoy del todo seguro, pero esto es lo que reuní a través de mi excavación.


Si la respuesta HTTP contiene la entrada etag, siempre se realizará la solicitud condicional. ETag es una etiqueta de validador de caché. El cliente siempre enviará el etag al servidor para ver si el elemento ha sido modificado.