“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 the data.
// What is that algorithm?
return result;
}
console.log(is_modified());
我依靠第三方 API 提供商来获取数据、解析和将其推送到我的数据库。每次请求期间数据可能会或可能不会更改,但标头始终发送 200
。我不想解析,检查 DB 中的最后一个唯一 ID 等等......以确定数据的变化,也不想直接比较结果,而是我 md5()
、sha1()
和 crc32()
对结果进行哈希处理并工作很好,但我想知道确定 304
的算法。
我想使用同一种算法来确定我的数据的变化。
当浏览器将某些内容放入其缓存时,它还会存储来自服务器的 Last-Modified
或 ETag
标头。
然后浏览器发送一个带有 If-Modified-Since
或 If-None-Match
标头的请求,告诉服务器如果内容仍然具有该日期或 ETag,则发送 304。
服务器需要某种方法来计算每个资源的每个版本的修改日期或 ETag;这通常来自文件系统或单独的数据库列。
Last-Modified :请求对象的最后修改日期 If-Modified-Since :如果最后修改日期未更改,则允许返回 304 Not Modified。 ETag:ETag 是一个不透明的标识符,由 Web 服务器分配给在 URL 中找到的特定版本的资源。如果该 URL 上的资源表示发生变化,则会分配一个新的不同的 ETag。 If-None-Match :如果 ETag 未更改,则允许返回 304 Not Modified。
浏览器使用 date(Last-Modified) 或 id(ETag) 存储缓存,当您需要再次请求 URL 时,浏览器会发送带有 header 的请求消息:
https://i.stack.imgur.com/CxmDR.png
if 语句为 False 时服务器会返回 304,浏览器会使用缓存。
ETag
是关键字,使用标题检查ETag
在Response Headers
和Response Headers
中保持相同Response Headers From Cache
,你能说出ETag
背后的算法吗?我已经更新了我的问题,说明了我的要求。ETag
只是服务器可以存储唯一 ID 的字段(通常是哈希或版本号或矢量时钟)。它根本无法帮助您计算该 ID。这取决于您的服务器端代码。max-age
,那么浏览器是否需要发出请求? (因为它可以存根 304 并且根本不发出请求)......你想要这个,例如“指纹”资产(它们永远是好的)。否则max-age
有什么意义......