如何“304未修改”的作品?

  • 如何生成“304未修改”?

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

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

  • 如果通过服务器发送,服务器如何知道caching中可用的数据,又如何将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提供商来获取数据,parsing并推送到数据库。 数据在每次请求过程中都可能发生变化,也可能不发生变化,但是标题总是发送200 ,我不想分析,检查DB中最后一个唯一标识符等等,以确定数据的变化,也不直接比较结果我md5()sha1()crc32() Hashed结果&工作正常,但想知道algorithm来确定304

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

当浏览器将某些内容放入caching中时,它还会从服务器存储Last-ModifiedETag标头。

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

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

Last-Modified:所请求的对象的最后修改date

If-Modified-Since:如果上次修改date保持不变,则允许返回304 Not Modified。

ETag:ETag是由Web服务器分配给在URL处find的特定资源版本的不透明标识符。 如果该URL的资源表示forms发生变化,则会分配一个新的不同的ETag。

If-None-Match:允许在ETag不变的情况下返回304 Not Modified。

浏览器存储caching中有一个date(Last-Modified)或者id(ETag),当你需要再次请求URL时,浏览器发送带有标题的请求消息:

在这里输入图像描述

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