HTTP头中的“cache-control:s-maxage=31536000,stale-while-revalidate”是如何工作的?

4
我正在我的项目中使用NextJS。对于每个页面请求,它会在响应中添加“s-maxage=31536000, stale-while-revalidate”缓存控制规则。这两个规则如何共同工作?
1个回答

4

s-maxagestale-while-revalidatecache-control HTTP头标准 的一部分,它们指示网页对象的缓存。

正如您所提到的问题,它们可以用逗号分隔来实现您想要的缓存策略

Cache-Control: s-maxage=1, stale-while-revalidate=60

第一个值(s-maxage)表示对象应该缓存多长时间,以秒为单位。它还“覆盖了max-ageExpires头字段,但仅适用于共享缓存(例如代理),并被私有缓存忽略”-请参见 HTTP expiration

第二个值(stale-while-revalidate如果支持,则在s-maxage到期后,该对象可以再次缓存的时间长度,直到需要从您的站点重新请求。


示例

  • 初始请求 - 内容使用上述cache-control指令缓存
  • 在初始请求后1-60秒之间请求 - 显示缓存内容 - 在后台重新验证
  • 在初始请求后60秒或更长时间请求 - 导致浏览器请求新版本的内容进行服务。

下面是如何在 Next.js 中设置 缓存头文件

这是我发布的一个相关帖子,强调了 Next.js 中 ISR 过程。


2
请注意,s-maxagemaxage不是相同的含义(请参见https://dev59.com/mpvga4cB1Zd3GeqP3owh);相关规范应该是“HTTP”,而不是“HTML”。 - Joe
1
“s-maxage=31536000,stale-while-revalidate”头是NextJS(SSG)默认为html请求设置的。在您的解释中,您说s-maxage头仅适用于代理。我们为什么需要在代理上缓存html文件?为什么“stale-while-revalidate”没有值? - Dzianis Sudas
我并没有说它只适用于代理 - 这是HTTP规范的解释(请参见我链接的规范)。Stale-while-revalidate没有价值,因为它没有被使用。您可以缓存代理,这样您就不必在每个请求上都访问您的Web服务器,这是在代理级别进行缓存的标准做法。https://www.imperva.com/learn/performance/cdn-caching/ - Sean W
2
对于's-maxage = 31536000、stale-while-revalidate',这是否意味着stale-while-revalidate将始终被忽略(因为它没有值),并且所请求的html文件将在代理(CDN)上缓存1年? - Dzianis Sudas
1
如果您使用的服务器遵守s-maxage头,则在您的情况下,它将请求(但不保证)缓存1年。代理服务器还可以设置自己的缓存驱逐规则(常见示例是aws cloudfront缓存失效)。是的,stale-while-revalidate基本上是关闭的。 - Sean W
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接