Estoy tratando de encontrar los mejores encabezados HTTP para enviar en cuatro casos de uso. Espero encontrar encabezados que no dependan del rastreo de la versión de agente/agente de usuario, pero lo aceptaré si nada más se ajusta. Todas las URL se obtienen a través de un controlador totalmente personalizado para que pueda seleccionar todos los encabezados como me gusta, esto se trata de intermediarios y agentes de usuario. Si es posible, esto debería ser compatible con los clientes HTTP/1.0 y HTTP/1.1. Si existen múltiples soluciones, la mejor será la más corta cuando se envíe por cable.Encabezados HTTP: control de la memoria caché y el mecanismo del historial
contenido público estático
Todos "contenido público estático" es algo que HTTP es realmente todo: si la URL es la misma, el contenido es el mismo. Puedo hacerlo fácilmente: por ejemplo, puse el icono de perfil de usuario en http://domain.com/profiles/xyz/icon/1234abcd donde "1234abcd" es el SHA-1 del contenido del archivo del icono. Si cambio al ícono en el futuro, crearé una nueva URL y modificaré todas las referencias existentes que deberían usar el ícono nuevo. ¿Cuáles son los mejores encabezados para declarar que esto se puede almacenar en caché para siempre y se puede compartir? Actualmente estoy pensando algo en la línea:
Date: <current time>
Expires: <current time + one year>
¿Es esto suficiente para permitir el almacenamiento en caché de las aplicaciones del usuario y los servidores proxy? ¿Necesito Last-Modified
o Pragma
?
contenido no pública estática
Todos "contenido no pública estática" es algo que es estático sino que puede no estar disponible a todo el mundo. De hecho, este contenido estará disponible solo para los usuarios que hayan iniciado sesión seleccionados (la sesión se mantiene con la cookie de sesión que contiene el UUID de la sesión). Si la URL es la misma, el contenido es el mismo. Sin embargo, la respuesta no es pública. Un caso de uso podría ser una imagen compartida con amigos seleccionados en un servicio de red social. Actualmente estoy pensando algo así:
Date: <current time>
Expires: <current time>
Cache-Control: private, max-age=<huge number>, s-maxage=0
¿Esto es suficiente para permitir el almacenamiento en caché por parte de los agentes de usuario y desactivar los proxies? ¿Necesito Pragma
?
contenido público volátil
Todos "contenido público volátil" es materia que es volátil y está disponible para todo el mundo. Algo así como la página principal de http://slashdot.org/ cuando no está conectado. La intención es permitir la actualización rápida del contenido en una URL no cambiante. Tenga en cuenta que NO quiero romper el mecanismo de historial de agente de usuario (es decir, hacer clic en algo de una página volátil y luego presionar el botón Atrás no debe llevar la página volátil del servidor; sin embargo, hacer clic en un vínculo va a la página frontal debe buscar el recurso del servidor). Actualmente estoy pensando algo en la línea:
Date: <current time>
Expires: <current time>
Cache-Control: public, max-age=0, s-maxage=0
¿Es esto suficiente para evitar el almacenamiento en caché, pero para permitir mecanismo de historial (botón Atrás)? Sé que si envío Cache-Control: no-store, must-revalidate
puedo forzar la recarga, pero esto no es lo que quiero porque también romperá el botón de retroceso. ¿Necesito Last-Modified
o Pragma
?
Aunque esto es público, probablemente no tenga sentido permitir que los proxies intermedios guarden en caché esto porque es volátil.
contenido no volátil pública
Todos "contenido no volátil pública" es un material que es volátil y no está disponible para todo el mundo (privado). Algo así como la página principal de http://slashdot.org/ cuando estás conectado. La intención es permitir la actualización rápida del contenido en una URL no cambiante. Tenga en cuenta que NO quiero romper el mecanismo de historial de agente de usuario (es decir, hacer clic en algo de una página volátil y luego presionar el botón Atrás no debe llevar la página volátil del servidor; sin embargo, hacer clic en un vínculo va a la página frontal debe buscar el recurso del servidor). Actualmente estoy pensando algo en la línea:
Date: <current time>
Expires: <current time>
Cache-Control: private, max-age=0, s-maxage=0
¿Es esto suficiente para evitar el almacenamiento en caché, pero para permitir mecanismo de historial (botón Atrás)? ¿Necesito Pragma
?
cosas que aún deben probar con mis cabeceras sugerida:
- Verificar que el contenido privado no se filtrará a través de servidores proxy HTTP/1.0.
- Verifique que el almacenamiento en caché funcione correctamente en los proxies.
- Verifique que el almacenamiento en caché funcione correctamente en los agentes de usuario.
- Verifique que el mecanismo de historial de agente de usuario funciona en agentes de usuario (en todos los casos).
- Compruebe que al seguir un enlace a una página volátil obtiene contenido nuevo del servidor.
- Verifique todos los resultados cuando use HTTPS en lugar de HTTP.
Conozco una pregunta similar anterior en http://stackoverflow.com/questions/2970938/ideal-http-cache-control-headers-for-different-types-of-resources - sin embargo, eso es Faltan tres piezas importantes del rompecabezas: el comportamiento del botón de retroceso, la compatibilidad del agente de usuario y el soporte proxy HTTP/1.0. –
La otra fuente frecuentemente citada http://www.mnot.net/cache_docs/ también sufre de no tratar el comportamiento del agente de usuario en el mundo real con respaldo de botón y HTTP/1.0 proxy. –
Aquí hay un artículo sobre Cache-Control: http://palisade.plynt.com/issues/2008Jul/cache-control-attributes/ - también falta el comportamiento del botón de retroceso en el mundo real, la compatibilidad del agente de usuario y el soporte proxy HTTP/1.0. –