当您将 Cache-Control: max-age 与 ETag 一起使用时会发生什么?

What happens when you use Cache-Control: max-age with ETags?

有几个类似的问题,但 none 我发现的问题很清楚或明确。

这是我想要的行为:

我想我可以用 Cache-Control: max-age 和 ETag 做到这一点。但是,我找不到 max-age 应该是 0 还是内容应该缓存多长时间。

例如如果我用 ETag Cache-Control: max-age=86400(1 天),会不会:

  1. 每次都向服务器请求,但如果ETag没有改变,服务器只会return 304。 1天后,丢弃缓存版本,从服务器重新获取(应该与丢弃版本相同)。

  2. 一天不发出任何服务器请求。然后,1天后,服务器仍然可以return304。缓存版本可以无限期保留。

我希望浏览器在 X 天后重新获取,因为万一出现错误,我不希望用户受困于损坏的缓存版本。

Here's the behavior I want:

  • As long as the network is available, the browser must check if there's a new version
  • If there isn't a new version, the browser can use the cached version

这是一个常见的用例,可以通过使用 Cache-Control: no-cache(或 max-age=0, must-revalidate)并提供 ETagLast-Modified header 来完成.

  • The cached version expires after X days

这是不可能的。它不是 HTTP 缓存设计的一部分,因为它没有用例。

I'd like the browser to refetch after X days because in case there's a bug, I don't want users stuck with a broken cached version.

如果浏览器每次都检查新版本,用户怎么会遇到“损坏的”缓存版本?

If I do Cache-Control: max-age=86400 (1 day) with an ETag, would it:

  1. Make a server request every time, but the server will just return 304 if the ETag didn't change. After 1 day, discard the cached version, and refetch from the server (which should be the same as the discarded version).

  2. Doesn't make any server requests for a day. Then, after 1 day, the server can still return 304. The cached version can stay indefinitely.

Number 2. max-age 告诉浏览器可以将资源视为 fresh 的时间,这意味着可以使用缓存版本而无需检查服务器。当该时间到期时,资源被认为 过时 ,必须发出新的请求。如果缓存的资源有 ETagLast Modified header 请求可以是 conditional 允许服务器避免发送整个资源响应。