【问题标题】:Cache-Control: What happens if Browser and Client specifies a Cache-Control header? [closed]Cache-Control:如果 Browser 和 Client 指定一个 Cache-Control 标头会发生什么? [关闭]
【发布时间】:2021-07-15 00:54:23
【问题描述】:

我正在为我的应用程序中的缓存控制而苦苦挣扎。

显然我的浏览器正在请求 Max-Age=0 的 HTML 文件。我的网络服务器没有指令,但 CDN 代理传递了一个 24 小时有效的缓存指令。

问题是,例如,如果浏览器在请求中传递了 No-Cache,但服务器指定了 Cache 时间,会发生什么情况?什么优先级最高?

我可以完全忽略客户端的缓存吗,还是我总是受制于服务器的响应?

谢谢!

【问题讨论】:

标签: http nginx caching browser cache-control


【解决方案1】:

您混淆了请求和响应中标头的含义。

在请求标头中,MaxAge=0 表示“我想要来自源服务器的此内容的最新版本”。客户端应该能够指定一个非零值和任何版本早于该版本的代理缓存,即使它仍然被认为是有效的,应该向上游发出新请求,尽管 HTTP/1.1这个规范有点模糊。

在响应标头中,Max-Age=N 表示“这是内容,您最多可以重复使用 N 秒(减去当前年龄的任何指定值)而无需再次请求”。

没有冲突。客户端完全有权在缓存时间到期之前再次询问。

如果您的源服务器没有指定 Max-Age(也没有指定 Expires 标头),这里就会出现复杂情况。它不应该那样做(除非它被明确告知这样做)。这表明代理表现不佳,您应该与代理服务提供商交谈。

鉴于代理表现不佳,即使客户端要求新副本,它也可能会提供陈旧的内容。

但这不全是他们的错。如果您不希望内容可缓存,那么您应该在响应标头中使用Cache-control: no-cache 明确说明这一点。在没有显式缓存指令的情况下,客户端和中间缓存可能重用内容。

【讨论】:

  • 感谢您的回复。但是,如果客户端(浏览器)通过无缓存并且服务器发送 Expires 或 Max age 怎么办?客户端是否仍然缓存它?在您的回答中,您说要在响应中添加无缓存。更具体地谈论浏览器,而不是一般的 HTTP 标准,如果浏览器通过 no-cache,它永远不会缓存东西,无论响应头是什么?
  • 我担心这个问题不清楚。从您的回答中我得到:1-请求中的 Max Age 足以向服务器询问新内容(如果存在)。 2- 响应中的 Max-Age 告诉浏览器可以安全使用该版本的时间量。问题 1:浏览器会使用这个以 max age 服务的文件还是在下次重新加载时再次请求?因为请求总是相同的:max-age=0,尽管响应说“保持 N 秒”。也许它是模糊的,取决于实施?!问题2:如果浏览器请求No-cache并且服务器响应“keep it for N secs”怎么办?
  • 我怀疑我们正在谈论一个 (A|S)JAX 请求,其中代码在客户端显式设置标头,因为我从未见过浏览器本机执行此操作。而且您似乎正在尝试解决 XY 问题 - 如果您不希望任何缓存重播缓存的内容,那么这应该在源头的标题中设置。
猜你喜欢
  • 2018-10-06
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2021-04-22
相关资源
最近更新 更多