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-age
es que el navegador ni siquiera tiene que realizar una solicitud condicional .
- si solo especificó
Last-Modified
, el navegador debe realizar una solicitud If-Modified-Since
y esperar una 304 Not Modified
respuesta
- 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"
Expires
es un equivalente heredado del Cache-Control: max-age
encabezado 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 rowversion
como 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 ETag
es superior a Last-Modified
porque funciona para cosas además de archivos , o cosas que tienen una noción de fecha . Solo es