¿Cuál podría ser la diferencia entre if-modified-since y if-none-match? Tengo la sensación de que if-none-match se usa para archivos, mientras que if-modified-since se usa para páginas.
Respuestas:
Respecto a las diferencias entre Last-Modified/If-Modified-Since
y ETag/If-None-Match
:
Ambos se pueden usar indistintamente. Sin embargo, dependiendo del tipo de recurso y de cómo se genera en el servidor, una u otra pregunta ("¿se ha modificado desde ...?" / "¿Todavía coincide con esta ETag?") Puede ser más fácil de responder. .
Ejemplos:
mtime
como Last-Modified
fecha es la solución más simple.ETag
será mucho más fácil usar, por ejemplo, un hash md5 del contenido de la página . Consulte estos enlaces para obtener más detalles sobre el tema:
If-Modified-Since
se compara con el Last-Modified
mientras que If-None-Match
se compara con ETag
. Ambos Modified-Since
y ETag
se pueden utilizar para identificar una variante específica de un recurso.
Pero la comparación de If-Modified-Since
to Last-Modified
le brinda información sobre si la variante almacenada en caché es más antigua o más nueva, mientras que la comparación de If-None-Match
to ETag
solo le brinda información sobre si ambos son idénticos o no. Además, ¿la mayoría de los ETag
generadores incluyen la información del inodo específico del sistema, por lo que mover un archivo a una unidad diferente también puede cambiar el ETag
.
El valor de la marca de tiempo utilizado en Last-Modified / If-Modified-Since tiene una precisión limitada: un segundo y eso simplemente no es suficiente para el contenido que cambia rápidamente como, por ejemplo, la aplicación de chat web donde se puede publicar más de un mensaje en un segundo dado . ETag / If-None-Match puede ayudar a resolver ese problema.
Como se indica en las mejores prácticas de Google:
Es importante especificar uno de Expires o Cache-Control max-age, y uno de Last-Modified o ETag, para todos los recursos que se pueden almacenar en caché. Es redundante especificar Expires y Cache-Control: max-age, o especificar tanto Last-Modified como ETag.
https://developers.google.com/speed/docs/best-practices/caching
Last-Modified
con ETag
(o, en el lado del agente de uso, If-Modified-Since
con If-None-Match
). Del mismo modo, la especificación W3 no te restringe. Dice que no se use If-Modified-Since
con If-Match
, pero supongo que se debe a que el conjunto de documentos que tienen fechas actualizadas pero el mismo contenido definido por ETag debería ser bastante pequeño.
If-Modified-Since usa una fecha, mientras que If-None-Match usa una ETag . Ambos se pueden utilizar para "páginas" (es decir, HTML) y otros archivos.
A menos que el servidor lo indique como débil, una ETag se considera un validador fuerte y, por lo tanto, se puede utilizar para satisfacer una solicitud de rango condicional. Sin embargo, la mayoría de los ETag generados automáticamente presentan dificultades en situaciones de granjas de servidores, ya que a menudo utilizan información de inodo y / o un contador persistente único. En la práctica, he encontrado que el encabezado Última modificación es suficiente para contenido bastante estático, por ejemplo, para servir contenido estático protegido, ya que el tiempo de escritura del archivo es un validador razonablemente bueno.
El ETag es, con mucho, el más flexible. Se requiere que los clientes conformes envíen el ETag en una solicitud condicional, mientras que DEBERÍAN enviar ambos si están disponibles.
El encabezado If-Modified-Since se utiliza para especificar el momento en el que el navegador recibió por última vez el recurso solicitado. El encabezado If-None-Match se utiliza para especificar la etiqueta de entidad que el servidor emitió con el recurso solicitado cuando se recibió por última vez.
De las dos formas descritas, estos encabezados se utilizan para admitir el almacenamiento en caché de contenido dentro del navegador, y permiten que el servidor indique al navegador que utilice una copia en caché de un recurso, en lugar de responder con el contenido completo del recurso si es no es necesario.