“未修改的304”到底是怎么工作的?

  • 如何产生「304未修改」的回应?

  • 浏览器如何确定对 HTTP 请求的响应是否为304?

  • 是由浏览器设置还是从服务器发送?

  • 如果由服务器发送,服务器如何知道缓存中可用的数据,以及如何将304设置为映像?

我猜,如果是浏览器生成的:

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());

我依靠第三方 API 提供商获得数据,解析和推送到我的数据库。在每次请求期间,数据可能会更改,也可能不会更改,但是头始终发送 200。我不想解析,检查数据库中最后的唯一 ID 等等... 来确定数据的变化,也不想直接比较结果,而是 I md5()sha1()crc32()散列结果和工作正常,但我想知道算法来确定 304

我想使用同样的算法来确定我的数据的变化。

170407 次浏览

当浏览器在其缓存中放入某些内容时,它还存储来自服务器的 Last-ModifiedETag头文件。

然后浏览器发送一个带有 If-Modified-SinceIf-None-Match头的请求,告诉服务器发送一个304,如果内容仍然有该日期或 ETag。

服务器需要某种方法来计算每个资源的每个版本的日期修改或 ETag; 这通常来自文件系统或单独的数据库列。

Last-Amendment: 请求对象的最后修改日期

如果-修改-因为: 允许一个304不修改返回如果最后 修改日期不变。

ETag: ETag 是由 Web 服务器分配给 在 URL 中找到的资源的特定版本 一个新的和不同的 ETag 是 分配。

如果-无-匹配: 允许一个304不修改返回如果 ETag 是 没变。

当你需要再次请求网址时,浏览器会发送带有标题的请求消息:

enter image description here

当 if 语句为 False 时,服务器将返回304,并且浏览器将使用缓存。