"304 Not Modified"如何运作?

Ven*_*dor 165 browser http 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());
Run Code Online (Sandbox Code Playgroud)

我依靠第三方API提供程序来获取数据,解析并将其推送到数据库.在每个请求期间数据可能会也可能不会发生变化,但是标题总是发送200,我不想解析,检查DB中的最后一个唯一ID等等来确定数据的变化,也不直接比较结果而是我md5(),sha1()&crc32()HASHed结果和工作正常,但想知道算法来确定304.

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

SLa*_*aks 193

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

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

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

  • @VenomVendor:`ETag`只是服务器可以存储唯一ID(通常是散列或版本号或向量时钟)的字段.它根本无法帮助您计算该ID; 这取决于您的服务器端代码. (4认同)
  • @ user1050619:您的服务器需要确保ETag准确无误.如果您显示数据库中的数据,则需要包含该数据. (3认同)

宏杰李*_*宏杰李 17

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时,浏览器发送带有标题的请求消息:

在此输入图像描述

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