Para responder a su pregunta sobre por qué funciona el almacenamiento en caché, aunque el servidor web no incluye los encabezados:
- Caduca:
[a date]
- Control de caché: max-age =
[seconds]
El servidor solicitó amablemente a los proxies intermedios que no almacenen en caché el contenido (es decir, el elemento solo debe almacenarse en caché en un caché privado , es decir, solo en su propia máquina local):
- Control de caché: privado
Pero el servidor olvidó incluir cualquier tipo de sugerencias de almacenamiento en caché:
- olvidaron incluir Expires , por lo que el navegador sabe usar la copia en caché hasta esa fecha
- se olvidaron de incluir Max-Age , por lo que el navegador sabe cuánto tiempo es bueno para el elemento en caché
- olvidaron incluir E-Tag , por lo que el navegador puede hacer una solicitud condicional
Pero sí incluyeron una fecha de Última modificación en la respuesta:
Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT
Como el navegador sabe la fecha en que se modificó el archivo, puede realizar una solicitud condicional . Le pedirá al servidor el archivo, pero le indicará que solo envíe el archivo si se ha modificado desde el 16/10/2012 3:13:38:
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
El servidor recibe la solicitud, se da cuenta de que el cliente ya tiene la versión más reciente. En lugar de enviar al cliente 200 OK, seguido del contenido de la página, le dice que su versión en caché es buena:
304 Not Modified
Su navegador tuvo que sufrir el retraso de enviar una solicitud al servidor y esperar una respuesta, pero ahorró tener que volver a descargar el contenido estático.
¿Por qué Max-Age ? ¿Por qué caduca ?
Porque Last-Modified apesta.
No todo en el servidor tiene una fecha asociada. Si estoy construyendo una página sobre la marcha, no hay una fecha asociada, es ahora . Pero estoy perfectamente dispuesto a dejar que el usuario almacene en caché la página de inicio durante 15 segundos:
200 OK
Cache-Control: max-age=15
Si el usuario martilla F5, seguirá obteniendo la versión en caché durante 15 segundos. Si se trata de un proxy corporativo, todos los 67198 usuarios que accedan a la misma página en la misma ventana de 15 segundos obtendrán el mismo contenido, todo servido desde un caché cercano. Victoria de rendimiento para todos.
La virtud de agregar Cache-Control: max-agees que el navegador ni siquiera tiene que realizar una solicitud condicional .
- si solo especificó
Last-Modified, el navegador debe realizar una solicitud If-Modified-Sincey esperar una 304 Not Modifiedrespuesta
- si lo especificó
max-age, el navegador ni siquiera tendrá que sufrir el viaje de ida y vuelta de la red; el contenido saldrá directamente de los cachés
La diferencia entre "Cache-Control: max-age" y "Expires"
Expireses un equivalente heredado del Cache-Control: max-ageencabezado moderno (c. 1998) :
Expires: especifica una fecha ( qué asco)
max-age: especifica segundos (bondad)
Y si se especifican ambos , entonces el navegador usa max-age:
200 OK
Cache-Control: max-age=60
Expires: 20180403T192837
Cualquier sitio web escrito después de 1998 ya no debería usarse Expires, y en su lugar debe usarse max-age.
¿Qué es ETag?
ETag es similar a Last-Modified , excepto que no tiene que ser una fecha, solo tiene que ser algo .
Si estoy sacando una lista de productos de una base de datos, el servidor puede enviar el último rowversioncomo un ETag, en lugar de una fecha:
200 OK
ETag: "247986"
Mi ETag puede ser el hash SHA1 de un recurso estático (p. Ej., Imagen, js, css, fuente) o de la página renderizada en caché (es decir, esto es lo que hace el wiki de Mozilla MDN; ellos cortan el marcado final):
200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Y exactamente como en el caso de una solicitud condicional basada en Last-Modified :
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
304 Not Modified
Puedo realizar una solicitud condicional basada en el ETag:
GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
304 Not Modified
An ETages superior a Last-Modifiedporque funciona para cosas además de archivos , o cosas que tienen una noción de fecha . Solo es