【问题标题】:How does HTTP header "cache-control: s-maxage=31536000, stale-while-revalidate" work?HTTP 标头“cache-control: s-maxage=31536000, stale-while-revalidate”是如何工作的?
【发布时间】:2021-08-11 23:49:19
【问题描述】:

我在我的项目中使用 NextJS。对于每个页面请求,它都会添加 's-maxage=31536000, stale-while-revalidate' 缓存控制规则作为响应。这两条规则应该如何协同工作?

【问题讨论】:

    标签: http next.js cdn cache-control s-maxage


    【解决方案1】:

    s-maxagestale-while-revalidate 是指示缓存 Web 对象的 cache-control HTTP header standard 的一部分。

    正如您的问题所暗示的,它们可以用逗号分隔以实现您想要的caching strategy

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

    第一个值 (s-maxage) 是以秒为单位缓存对象的时间。它还“覆盖 max-ageExpires 标头,但仅适用于共享缓存(例如代理)并且被私有缓存忽略” - 请参阅 HTTP expiration

    第二个值 (stale-while-revalidate),if supported,是在 s-maxage 过期后多久可以缓存对象,直到需要再次从您的站点请求它。


    示例

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

    这里是如何设置caching headers in Next.js

    这是我制作的related post,它突出显示了 Next.js 中的 ISR 流程。

    【讨论】:

    • 请注意,s-maxage notmaxage 的含义相同(请参阅stackoverflow.com/q/39992837/733345);并且相关规范将是“HTTP”,而不是“HTML”。
    • 抓得好乔!深夜错字。我没有解释 s-maxage 如何覆盖共享缓存的 maxage,因为它在规范中直接位于 max-age 之下。但是在这里为 tl;dr; 添加它并没有什么坏处;
    • 's-maxage=31536000, stale-while-revalidate' 标头由 NextJS (SSG) 开箱即用地为 html 请求设置。在您的解释中,您是说 s-maxage 标头仅用于代理。为什么我们需要在代理上缓存 html 文件?为什么 stale-while-revalidate 没有值?
    • 我并没有说它仅适用于代理 - 这是 HTTP 规范的解释(请参阅我链接的规范)。 Stale-while-revalidate 没有值,因为它没有被使用。您将缓存一个代理,这样您就不必在每次请求时都访问您的网络服务器,在代理级别缓存是标准的。 imperva.com/learn/performance/cdn-caching
    • 所以对于 's-maxage=31536000, stale-while-revalidate' 这是否意味着 stale-while-revalidate 将始终被忽略(因为它没有值)并且请求的 html 文件将在代理 (CDN) 上缓存 1 年?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2014-10-13
    • 2018-06-15
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多