“304 Not Modified”如何运作?

时间:2014-01-07 17:36:48

标签: http browser http-headers http-status-code-304

  • 如何生成“304 Not Modified”?

  • 浏览器如何确定对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,我不想解析,检查数据库中的最后一个唯一ID。等......确定数据的变化,也不直接比较结果,而是我md5()sha1()& crc32() HASHed结果&工作正常,但想知道确定304的算法。

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

2 个答案:

答案 0 :(得分:186)

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

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

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

答案 1 :(得分:15)

  

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

     

If-Modified-Since:允许在最后一次返回304 Not Modified   修改日期不变。

     

ETag:ETag是由Web服务器分配给的一个不透明的标识符   在URL处找到的特定资源版本。如果资源   这个URL的表示永远在变化,一个新的和不同的ETag是   分配

     

If-None-Match:如果ETag为,则允许返回304 Not Modified   不变。

浏览器存储缓存带有日期(Last-Modified)或id(ETag),当您需要再次请求URL时,浏览器会发送带有标题的请求消息:

enter image description here

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