if-modified-since vs if-none-match

89

¿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.

Torre
fuente

Respuestas:

112

Respecto a las diferencias entre Last-Modified/If-Modified-Sincey 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:

  • Si está sirviendo archivos, usar el archivo mtimecomo Last-Modifiedfecha es la solución más simple.
  • Si está sirviendo una página web dinámica creada a partir de una serie de consultas SQL, comprobar si los datos devueltos por alguna de esas consultas han cambiado puede ser poco práctico (a menos que todas tengan algún tipo de columna de "última modificación"). En este caso, ETagserá mucho más fácil usar, por ejemplo, un hash md5 del contenido de la página .
    OTOH, esto significa que todavía tiene que generar la página completa en el servidor, incluso para un GET condicional. Averiguar qué debe incluirse exactamente en la ETag (claves primarias, números de revisión, ... etc.) puede ahorrarle mucho tiempo aquí.

Consulte estos enlaces para obtener más detalles sobre el tema:

trendels
fuente
Le envié al navegador una ETag, pero nunca solicita la misma página con If-None-Match. ¿Cuál puede ser el problema?
Pacerier
2
@pacerier: los navegadores no están obligados a utilizar Etag. Por lo tanto, podría ser un navegador antiguo y simplemente ignorarlo. La otra posibilidad es que se esté accediendo a la entidad con parámetros de URL que cambian de una llamada a otra. Si el nombre de la entidad cambia, etag no se utilizará para diferentes solicitudes.
Rafael Baptista
@RafaelBaptista Para elaborar más sobre la segunda mitad del comentario, digamos que tengo esta situación: tengo un servidor de archivos y el servidor admite el control de versiones usando ETags y, por razones de compatibilidad con versiones anteriores, solíamos hacer que los clientes usaran un parámetro de consulta my_current_version = (versión ). Si envío una solicitud HTTP con valores variables para my_current_version, pero también con ETags, ¿qué criterio, como práctica recomendada, se priorizará al determinar si servir una nueva versión o devolver una 304? ¡Gracias!
smiling_man
1
La forma en que el servidor usa Etag depende del servidor. Probablemente pueda configurar la mayoría de los servidores de archivos para ignorar los parámetros con etag si lo desea mediante reglas de reescritura. Tiene menos control sobre el cliente: el navegador. La mayoría no enviará un encabezado etag que obtuvieron para un conjunto de parámetros en una solicitud para otro. Una solicitud de cliente para la imagen? V = 1 no enviará el mismo etag para la imagen? V = 2. Si estuviera escribiendo mis propios servidores, implementaría etag como un hash del contenido de la imagen. Cualquier url que solicite un recurso y venga con un etag que coincida con el hash de la imagen que enviaría, devuelvo 304.
Rafael Baptista
22

If-Modified-Sincese compara con el Last-Modifiedmientras que If-None-Matchse compara con ETag. Ambos Modified-Sincey ETagse pueden utilizar para identificar una variante específica de un recurso.

Pero la comparación de If-Modified-Sinceto Last-Modifiedle 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-Matchto ETagsolo le brinda información sobre si ambos son idénticos o no. Además, ¿la mayoría de los ETaggeneradores 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.

Gumbo
fuente
Interesante, pero ¿por qué debería utilizar comprobaciones "idénticas" sobre las comprobaciones de "última modificación"? ¿Cuales son los beneficios? Si tiene un archivo para publicar, ¿cuál es la mejor opción?
Torre
7
Con las computadoras, el tiempo es frágil. Los segundos bisiestos, el cambio entre el horario de verano y los relojes inexactos pueden hacer que una verificación de "última modificación" arroje un resultado incorrecto. Comparar el contenido en sí (o el hash MD5 del contenido) evita esos problemas.
devdanke
A pesar de que entiendo completamente a @devdanke, diría que verificar la marca de tiempo es mucho más rápido que verificar md5sum. El propósito de estos encabezados es hacerlo más rápido, a veces se prefiere no transferir una versión nueva de una entidad al cliente que cargar el servidor con E / S. De todos modos, el usuario siempre puede presionar ctrl + shift + R (o ctrl + F5 o lo que sea)
Grief
13

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.

Alex K
fuente
9

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

Arvanitis por Dionisios
fuente
esa URL ya no tiene texto similar a ese. No se menciona ninguna restricción contra el uso Last-Modifiedcon ETag(o, en el lado del agente de uso, If-Modified-Sincecon If-None-Match). Del mismo modo, la especificación W3 no te restringe. Dice que no se use If-Modified-Sincecon 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.
mpag
3

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.

Thomas S. Trias
fuente
0

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.

Serhan M.
fuente