¿Cómo funciona exactamente "304 no modificado"?

175
  • ¿Cómo se generan las respuestas "304 no modificadas"?

  • ¿Cómo determina un navegador si la respuesta a una solicitud HTTP es 304?

  • ¿Es configurado por el navegador o enviado desde el servidor?

  • Si lo envía el servidor, ¿cómo sabe el servidor los datos disponibles en caché, y también cómo establece 304 en una imagen?

Mi conjetura, si es generado por el navegador:

function is_modified()
{
    return get_data_from_cache() === get_data_from_url();
}

function get_data_from_cache()
{
    return some_hash_or_xxx_function(cache_data);
}

function get_data_from_url()
{
     return some_hash_or_xxx_function(new_data);
}

function some_hash_or_xxx_function(data)
{
     // Do something with the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

Confío en un proveedor de API externo para obtener datos, analizarlos y enviarlos a mi base de datos. Los datos pueden o no cambiar durante cada solicitud, pero el encabezado siempre envía 200. No quiero analizar, verificar la última ID única en DB y así sucesivamente ... para determinar el cambio en los datos, ni comparar el resultado directamente en lugar de yo md5(), sha1()y crc32()el resultado hash y funciona bien, pero me pregunto sobre el algoritmo para determinar 304.

Quiero usar el mismo tipo de algoritmo para determinar el cambio en mis datos.

VenomVendor
fuente
2
Sí, busqué en Google cómo funciona 304 no modificado , pero no obtuve ninguna respuesta.
VenomVendor
1
Necesitas ser un poco más general. google.com/search?q=http%20caching
SLaks

Respuestas:

201

Cuando el navegador coloca algo en su caché, también almacena el encabezado Last-Modifiedo ETagdel servidor.

El navegador luego envía una solicitud con el encabezado If-Modified-Sinceo If-None-Match, diciéndole al servidor que envíe un 304 si el contenido aún tiene esa fecha o ETag.

El servidor necesita alguna forma de calcular una fecha modificada o ETag para cada versión de cada recurso; Esto generalmente proviene del sistema de archivos o de una columna de base de datos separada.

SLaks
fuente
1
ETages la palabra clave, marcada con encabezados, ETagpermanece igual en ambos Response Headers& Response Headers From Cache, ¿puede decir el algoritmo detrás ETag? He actualizado mi pregunta indicando mi requisito.
VenomVendor
44
@VenomVendor: ETages solo un campo en el que el servidor puede almacenar una ID única (generalmente un hash o número de versión o reloj vectorial). No te ayuda a calcular esa identificación en absoluto; eso depende de su código del lado del servidor.
SLaks
@SLaks: ¿Qué sucede si la página tiene una llamada a base de datos ... Existe la posibilidad de que los datos en la base de datos hayan cambiado ... En este caso, no tiene sentido verificar la última llamada modificada, ¿Correcto? ¿Cómo se analiza esta condición?
user1050619
3
@ user1050619: Depende de su servidor asegurarse de que la ETag sea precisa. Si muestra datos de una base de datos, debe incluir eso.
SLaks
Una cosa que aún no está clara es si, si tiene una grande max-age, ¿necesita el navegador hacer la solicitud? (ya que podría tropezar en 304 y no hacer la solicitud en absoluto) ... desea esto, por ejemplo, con activos de "huellas digitales" (son buenos para siempre). De lo contrario, cuál es el punto de max-age...
Andy Hayden
19

Última modificación: la última fecha de modificación para el objeto solicitado

If-Modified-Since: permite que se devuelva un 304 No modificado si la última fecha de modificación no se modifica.

ETag: un ETag es un identificador opaco asignado por un servidor web a una versión específica de un recurso que se encuentra en una URL. Si la representación de recursos en esa URL cambia, se asigna un ETag nuevo y diferente.

If-None-Match: permite que se devuelva un 304 No modificado si ETag no se modifica.

el caché de la tienda del navegador con una fecha (Última modificación) o id (ETag), cuando necesita solicitar la URL nuevamente, el navegador envía un mensaje de solicitud con el encabezado:

ingrese la descripción de la imagen aquí

el servidor devolverá 304 cuando la instrucción if es False, y el navegador usará caché.

宏杰 李
fuente