0

我在网上看到了一些相互矛盾的答案,我试图从根本上理解这一点。假设我的网站上有一张图片热链接(是的,经许可):

<img src="externalserver.com/catpic.png">
  1. 假设所有相关方都启用了浏览器缓存,该图像是否会被缓存(也就是来自外部站点的图像甚至可以缓存)?
  2. 如果外部服务器决定在同一个文件位置提供不同的图像,比如 .htaccess 重写,缓存会被破坏吗?
  3. 如果外部服务器决定在 ?randomquerystring此后提供相同的图像,缓存会被破坏吗?
  4. 如果外部服务器响应 HTTP 状态代码 204 而不是实际提供图像,那么缓存会发生什么情况?

谢谢!祝大家节日快乐。

4

1 回答 1

1

这一切都取决于。

  1. 用户代理可以缓存图像。它是否会缓存图像取决于服务器设置Cache-ControlExpires标头的方式。有关更多信息,请查看 MDN 上的Cache-Control 标头页
  2. 用户代理可能会也可能不会获得新资源。这取决于Cache-Control标头、Expires标头、资源是否陈旧、服务器是否使用验证器以及是否执行弱验证或强验证。有关更多信息,请查看 MDN 上的HTTP 条件请求页面
  3. 服务器不使用?randomquerystring. 相反,客户端可以使用?randomquerystring. ?randomquerystring被称为缓存破坏者。用户代理将执行新请求,但我听说某些代理可能会忽略该类型的缓存破坏器并仍返回缓存响应。
  4. 用户代理可能会尊重Cache-ControlExpires标头。RFC 2616的相关摘录:

接收到的带有任何其他状态码(例如状态码 302 和 307)的响应不得在对后续请求的回复中返回,除非有缓存控制指令或其他明确允许的标头。例如,这些包括以下内容: Expires 标头(第 14.21 节);“max-age”、“s-maxage”、“must-revalidate”、“proxy-revalidate”、“public”或“private”缓存控制指令(第 14.9 节)。

有关 HTTP 缓存的更多信息,请查看Ilya Grigorik 的HTTP 缓存文章。

于 2017-01-11T11:18:13.590 回答