【问题标题】:Does 'cache-control: public' actually have any effect? [duplicate]“缓存控制:公共”实际上有什么效果吗? [复制]
【发布时间】:2021-06-14 00:27:03
【问题描述】:

任何已知缓存对cache-control: public, max-age=60 的处理方式是否与cache-control: max-age=60 不同?

我一直在努力验证它,但我假设如果响应中存在任何 cache-control 指令,则假定该响应可以被浏览器缓存并且任何中间缓存除非 cache-control: private 已设置。

这是否意味着cache-control: public 是多余的?这不是你会得到的行为吗?

【问题讨论】:

  • 嗯。是的,它似乎是,但这个答案与我在下面发现的有点冲突。所以我很好奇哪个是正确的。

标签: caching browser-cache cache-control


【解决方案1】:

在仔细阅读 MDN 之后,我想我已经找到了自己问题的答案。

TL;DR:cache-control: public 将明确覆盖哪些响应类型被视为可缓存的默认规则,因此不应轻易使用。许多响应通常不应该被缓存 - 例如POSTs 或 302 重定向。请参阅下面的完整规则集。

来自the cache-control page

公开 响应可以由任何缓存存储,即使响应通常是不可缓存的 (强调我的)

那么“可缓存”是什么意思?来自the "cacheable" page on the MDN glossary

可缓存响应是可以缓存的 HTTP 响应,存储后可以检索和使用,将新请求保存到服务器。并非所有 HTTP 响应都可以缓存,以下是缓存 HTTP 响应的限制:

  • 请求中使用的方法本身是可缓存的,即 GET 或 HEAD 方法。如果指示了新鲜度并且设置了 Content-Location 标头,则还可以缓存对 POST 或 PATCH 请求的响应,但这很少实现。 (例如,Firefox 根据https://bugzilla.mozilla.org/show_bug.cgi?id=109553. 不支持它)其他方法,如 PUT 或 DELETE 不可缓存,其结果无法缓存。
  • 响应的状态码被应用程序缓存知道,它被认为是可缓存的。以下状态码是可缓存的:200、203、204、206、300、301、404、405、410、414 和 501。
  • 响应中有(我认为这应该是不是特定的标头,例如 Cache-Control,可以防止缓存。

所以看起来应该只在他们明确想要覆盖这些规则以实现可缓存性时才使用cache-control: public,这通常可能不是一个好主意。

【讨论】:

  • 一个响应can be cached,如果它指定max-age,不管public/private
  • @Joe 我认为你误读了。似乎明确地说,如果存在 no-store 或 private ,则不得存储缓存。 (列表中的每一项都必须为真)
  • 您在no-store 上是绝对正确的;这将阻止存储。对于private:““私有”响应指令...没有出现在响应中,如果缓存是共享的”。您的浏览器缓存未共享。
  • 哦,是的,我知道。我认为这与我的问题无关。我认为您的回答是建议 max-age 以某种方式覆盖公共或私有,但事实并非如此。无论如何, Private 的行为仍然完全一样。
  • 为了清楚起见,让我重新表述我的评论:为了可缓存,指定max-age 的响应就足够了。 publicprivate 都不是必需的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2014-07-14
  • 2014-10-08
  • 2013-01-10
  • 2012-10-06
  • 2011-10-12
  • 2019-12-22
相关资源
最近更新 更多