当您将 Cache-Control: max-age 与 ETag 一起使用时会发生什么?
What happens when you use Cache-Control: max-age with ETags?
有几个类似的问题,但 none 我发现的问题很清楚或明确。
这是我想要的行为:
- 只要网络可用,浏览器必须检查是否有新版本
- 如果没有新版本,浏览器可以使用缓存的版本
- 缓存版本在 X 天后过期
我想我可以用 Cache-Control: max-age
和 ETag 做到这一点。但是,我找不到 max-age 应该是 0
还是内容应该缓存多长时间。
例如如果我用 ETag Cache-Control: max-age=86400
(1 天),会不会:
每次都向服务器请求,但如果ETag没有改变,服务器只会return 304。 1天后,丢弃缓存版本,从服务器重新获取(应该与丢弃版本相同)。
一天不发出任何服务器请求。然后,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
)并提供 ETag
或 Last-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:
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).
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 的时间,这意味着可以使用缓存版本而无需检查服务器。当该时间到期时,资源被认为 过时 ,必须发出新的请求。如果缓存的资源有 ETag
或 Last Modified
header 请求可以是 conditional 允许服务器避免发送整个资源响应。
有几个类似的问题,但 none 我发现的问题很清楚或明确。
这是我想要的行为:
- 只要网络可用,浏览器必须检查是否有新版本
- 如果没有新版本,浏览器可以使用缓存的版本
- 缓存版本在 X 天后过期
我想我可以用 Cache-Control: max-age
和 ETag 做到这一点。但是,我找不到 max-age 应该是 0
还是内容应该缓存多长时间。
例如如果我用 ETag Cache-Control: max-age=86400
(1 天),会不会:
每次都向服务器请求,但如果ETag没有改变,服务器只会return 304。 1天后,丢弃缓存版本,从服务器重新获取(应该与丢弃版本相同)。
一天不发出任何服务器请求。然后,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
)并提供 ETag
或 Last-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:
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).
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 的时间,这意味着可以使用缓存版本而无需检查服务器。当该时间到期时,资源被认为 过时 ,必须发出新的请求。如果缓存的资源有 ETag
或 Last Modified
header 请求可以是 conditional 允许服务器避免发送整个资源响应。