“304不修改”是如何工作的?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)
  • 如何生成“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 data
  // what is that algorithm.?
      return result;
}

console.log(is_modified());

我依赖第三方API提供程序来获取数据,解析并将其推送到DB。在每个请求期间,数据可能更改也可能不更改,但是头总是发送200,我不想解析、检查DB中的最后一个唯一ID&等等...来确定数据的变化,也不想直接比较结果md5(),,,sha1()&crc32()散列结果&工作良好,但不知道要确定的算法304...

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

提问于
用户回答回答于

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

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

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

用户回答回答于

最后修改:请求对象的最后修改日期 如果上次修改日期不变,则允许返回304未修改。 ETag:ETag是Web服务器分配给在URL上找到的资源的特定版本的不透明标识符。如果该URL上的资源表示形式发生变化,则分配一个新的和不同的ETag。 如果-无匹配:如果ETag不变,则允许返回304未修改。

当你需要再次请求URL时,浏览器使用日期(最后修改)或id(ETag)存储缓存,浏览器发送带有标题的请求消息:

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

扫码关注云+社区