相关疑难解决方法(0)

浏览器使用什么启发式来缓存未明确设置为可缓存的资源?

13.2.2启发式过期

由于源服务器并不总是提供明确的到期时间,因此HTTP缓存通常会分配启发式到期时间,采用使用其他标头值(例如Last-Modified时间)的算法来估计合理的到期时间.HTTP/1.1规范没有提供特定的算法,但确实对其结果施加了最坏情况的约束.由于启发式到期时间可能会影响语义透明度,因此应谨慎使用,我们鼓励源服务器尽可能提供明确的到期时间. HTTP/1.1 RFC 2616

浏览器使用什么算法来估算合理的到期时间?

理想的答案将涵盖所有主要浏览器,并提供源代码或官方博客文章的证据.

safari firefox internet-explorer google-chrome browser-cache

24
推荐指数
5
解决办法
4438
查看次数

我应该将 Cache-Control: no-cache 添加到我的 REST API 的 GET 端点吗?

创建使用 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 调用?

    例如。 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 请求这样的标头不会被任何浏览器缓存?

caching http http-caching browser-cache offline-caching

6
推荐指数
1
解决办法
1247
查看次数