ChatGPT解决这个技术问题 Extra ChatGPT

“304 Not Modified”究竟是如何工作的?

“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 的算法。

我想使用同一种算法来确定我的数据的变化。

是的,我搜索了 how 304 not modified works,但没有得到任何答案。
你需要更笼统一些。 google.com/search?q=http%20caching

T
TayTay

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

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

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


ETag 是关键字,使用标题检查 ETagResponse HeadersResponse Headers 中保持相同Response Headers From Cache,你能说出ETag背后的算法吗?我已经更新了我的问题,说明了我的要求。
@VenomVendor:ETag 只是服务器可以存储唯一 ID 的字段(通常是哈希或版本号或矢量时钟)。它根本无法帮助您计算该 ID。这取决于您的服务器端代码。
@SLaks:如果页面有一个数据库调用会发生什么......数据库中的数据有可能已经改变......在这种情况下,检查最后修改的调用是没有意义的,对吗? .如何调查这种情况?
@user1050619:由您的服务器确保 ETag 准确无误。如果您显示来自数据库的数据,则需要包含该数据。
仍然不清楚的一件事是,如果您有一个大的 max-age,那么浏览器是否需要发出请求? (因为它可以存根 304 并且根本不发出请求)......你想要这个,例如“指纹”资产(它们永远是好的)。否则max-age有什么意义......
C
Community

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,浏览器会使用缓存。