2010-01-24 15 views
10

Parece que hay dos maneras distintas para poner en práctica las peticiones condicionales utilizando cabeceras HTTP, los cuales pueden ser utilizados para el almacenamiento en caché, las solicitudes de intervalo, control de concurrencia, etc ...:¿Qué sentido tiene If-Unmodified-Since/If-Modified-Since? ¿No están reemplazados por ETags?

  1. Si-no modificado-Dado y Si -Modificado: desde, donde el cliente envía un marca de tiempo del recurso.
  2. If-Modified y If-None-Modified, donde el cliente envía una representación ETag del recurso.

En ambos casos, el cliente envía una pieza de información que tiene sobre el recurso, que permite al servidor para determinar si el recurso ha cambiado desde el último cliente lo vio. El servidor luego decide si ejecutar la solicitud dependiendo del encabezado condicional proporcionado por el cliente.

No entiendo por qué hay dos enfoques diferentes disponibles. Sin duda, los ETags sustituyen a las marcas de tiempo, ya que el servidor podría elegir fácilmente generar ETags a partir de marcas de tiempo.

Por lo tanto, mis preguntas son:

  • En qué escenarios puede ser que usted a favor de Si-no modificado-Desde/If-Modified-Since sobre ETags?
  • ¿En qué escenarios podría necesitar ambos?
+1

Aunque es potencialmente tangencial, hay otra manera de hacer una solicitud condicional: If-Range. Puede usar un ETage o una marca de tiempo. –

Respuesta

11

Una vez ponderado lo mismo, y me di cuenta de que hay una diferencia que es bastante importante: las fechas se pueden pedir, ETags no.

Esto significa que si algún recurso se modificó hace un año, pero nunca desde entonces, y lo sabemos. Entonces podemos responder correctamente una solicitud If-Unmodified-Since para fechas arbitrarias el año pasado y acordar que seguro ... no ha sido modificado desde esa fecha.

Un Etag es solo comparable para la identidad. O es lo mismo o no lo es. Si tiene el mismo recurso que el anterior, y durante el año, el docroot se ha movido a un nuevo disco y sistema de archivos, dando a todos los archivos nuevos inodos pero conservando las fechas de modificación. Y alguien había basado los ETags en el número de inodo del archivo. Entonces no podemos decir que el viejo ETag todavía está bien, sin tener un registro de ETags pasados-todavía-bien.

Así que no los veo como una obsolescencia de la otra. Son para diferentes situaciones. O bien, puede obtener fácilmente una fecha de Última modificación de todos los datos en la página que está por ofrecer, o puede obtener fácilmente una ETag para lo que va a servir.

Si tiene una página web dinámica con datos de muchas búsquedas de db, puede ser difícil determinar la fecha de la última modificación sin que la base de datos contenga muchas fechas de modificación. Pero siempre puede hacer una suma de comprobación md5 de la página de resultados prestados.

Al admitir estos protocolos de caché, definitivamente voy solo por uno de ellos, nunca los dos.

+0

Upvoted, ese es un buen punto. ¿Pero siempre es cierto que ETags solo son comparables para la identidad? ¿Eso no depende de lo que usa el servidor como valores de Etag? Por ejemplo, tal como lo entiendo, un servidor podría elegir usar marcas de tiempo sin procesar como ETags para algunos recursos. De esta forma, los ETags se ordenarían para esos recursos. Entonces, si ETags efectivamente pueden * ser * marcas de tiempo, ¿qué sentido tiene un par de encabezado separado que solo funciona con marcas de tiempo? – rewbs

+4

Necesita agregar proxies en la ecuación. Si sus valores de Etag tienen un significado semántico, ahora no lo hacen. – Christian

1

Razón simple: retrocompatibilidad.

+0

Ok. ¿Estás diciendo que If-Unmodified-Since y If-Modified-Since son heredados, y por lo tanto en un escenario donde tienes control total sobre los encabezados enviados por el cliente y los encabezados procesados ​​por el servidor, solo debes usar ETags? – rewbs

+0

Para validación y/o solicitudes condicionales, ETag es el camino a seguir. Sin embargo, los encabezados Last-Modified tienen un significado semántico fuera de las solicitudes condicionales y deben enviarse también si tienes control sobre todo. Ver http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.4 –

-2

ETag es específico del servidor; esto significa que si su aplicación está en una granja de servidores web, terminaría con diferentes ETags en los diferentes servidores de la granja de servidores web.Entonces, en tal caso, se debe usar If-Unmodified-Since/If-Modified-Since. Puede echar un vistazo a la explicación más detallada en el YSlow rules page.

+3

Eso no es verdad en general, aunque podría terminar con esto si, por ejemplo, tiene archivos idénticos en diferentes discos duros servidos por diferentes servidores web. –

+0

Como dije, cuando se usa una granja de servidores web (varios servidores), los ETags son diferentes en los diferentes servidores. –

+2

Solo son diferentes si se ha implementado de esa manera. YSlow menciona una implementación predeterminada en apache que utiliza inodos de archivos como parte del ETag que lo hace. El contenido del ETag es opaco y una mejor implementación podría usar una suma de comprobación sobre el contenido servido. – Christian

3

Hay una gran diferencia: solo puedo usar ETags si ya le pedí al servidor una en el pasado. Timestamps, OTOH, puedo inventarme a medida que avanzo.

Cuestiones relacionadas