13.2.2启发式过期
由于源服务器并不总是提供明确的到期时间,因此HTTP缓存通常会分配启发式到期时间,采用使用其他标头值(例如Last-Modified时间)的算法来估计合理的到期时间.HTTP/1.1规范没有提供特定的算法,但确实对其结果施加了最坏情况的约束.由于启发式到期时间可能会影响语义透明度,因此应谨慎使用,我们鼓励源服务器尽可能提供明确的到期时间. HTTP/1.1 RFC 2616
浏览器使用什么算法来估算合理的到期时间?
理想的答案将涵盖所有主要浏览器,并提供源代码或官方博客文章的证据.
safari firefox internet-explorer google-chrome browser-cache
创建使用 POST/PUT 的 REST API 很简单。它们是非幂等的,因此默认情况下不会被浏览器缓存。
但是,在创建 GET 端点时,事情变得更棘手了。我担心浏览器(或特定浏览器)在默认情况下会尝试缓存 GET 请求,而我最终会得到陈旧的数据。
让我们以端点为例GET /articles/123/comments。
尽管这个端点是一个 GET 端点,但每个请求都可以返回不同的内容,因为文章的评论被提交。
假设没有与响应提供的缓存相关的标头。
content-length: 2518
content-type: application/json
date: Thu, 17 Oct 2019 07:51:59 GMT
status: 200
Run Code Online (Sandbox Code Playgroud)
似乎有不同的策略来解决这个问题,但最好的方法是什么?
通过唯一的查询字符串缓存破坏我的 GET 调用?
例如。 GET /articles/123/comments?nonce=12312310980923409
添加Cache-Control: no-cache(这会一直受到尊重吗?)
添加ETag: xyz_HASH_OF_MY_LIST_OF_COMMENTS?
添加Cache-Control: max-age=0(禁用缓存)
添加Cache-Control: max-age=60(以减少缓存的最大持续时间)
只是不要担心并假设没有像ETag, Last-ModifiedGET 请求这样的标头不会被任何浏览器缓存?