“ 304未修改”如何工作?


174
  • 如何生成“ 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

我想使用相同的算法来确定数据中的更改。


2
是的,我搜索了304未修改的工作原理,但是没有得到任何答案。
VenomVendor

1
您需要更一般一些。 google.com/search?q=http%20caching
SLaks

Answers:


200

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

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

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


1
ETag是关键字,ETagResponse Headers&中用标题检查的内容保持不变Response Headers From Cache,您能告诉我后面的算法吗ETag?我已经更新了我的问题,说明了我的要求。
VenomVendor 2014年

4
@VenomVendor:ETag只是服务器可以在其中存储唯一ID(通常是哈希或版本号或矢量时钟)的字段。它根本无法帮助您计算该ID。这取决于您的服务器端代码。
SLaks

@SLaks:如果页面上有数据库调用,会发生什么情况……数据库中的数据有可能会发生变化。在这种情况下,检查上次修改的调用“正确”是没有意义的。 。如何看待这种情况?
user1050619 2014年

3
@ user1050619:由您的服务器来确保ETag正确。如果显示来自数据库的数据,则需要包括该数据。
Slaks 2014年

尚不清楚的一件事是,如果max-age浏览器是否很大,浏览器是否需要发出请求?(因为它可能会在304中存根,而根本不会发出请求)...例如,您希望使用“指纹”资产(它们永远是好的)。其他的意义何在max-age
安迪·海登

19

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

If-Modified-Since:如果上次修改日期未更改,则允许返回304 Not Modified。

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

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

具有日期(最后修改)或id(ETag)的浏览器商店缓存,当您需要再次请求URL时,浏览器发送带有标头的请求消息:

在此处输入图片说明

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.