如何生成“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
的算法。
我想使用相同类型的算法来确定数据的变化。
答案 0 :(得分:186)
当浏览器将某些内容放入其缓存中时,它还会存储来自服务器的Last-Modified
或ETag
标头。
然后,浏览器会发送一个带有If-Modified-Since
或If-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时,浏览器会发送带有标题的请求消息:
当if语句为False时,服务器将返回304,浏览器将使用缓存。