【问题标题】:How does browser caching handle hotlinked images + 204 responses?浏览器缓存如何处理热链接图像 + 204 响应?
【发布时间】:2017-05-10 02:49:31
【问题描述】:
我在网上看到了一些相互矛盾的答案,我试图从根本上理解这一点。假设我的网站上有一张图片热链接(是的,经许可):
<img src="externalserver.com/catpic.png">
- 假设所有相关方都启用了浏览器缓存,将
这张图片被缓存(也就是来自外部网站的图片甚至可以缓存)?
- 如果外部服务器决定在同一文件位置提供不同的图像,例如重写 .htaccess,缓存会被破坏吗?
- 如果外部服务器决定使用
?randomquerystring之后,缓存会被破坏吗?
- 如果外部服务器以 HTTP 状态代码 204 代替
在实际提供图像时,缓存会发生什么?
谢谢!祝大家节日快乐。
【问题讨论】:
标签:
.htaccess
caching
browser-cache
http-status-code-204
【解决方案1】:
这一切都取决于。
- 用户代理可以缓存图像。是否缓存图像取决于服务器如何设置
Cache-Control 或Expires 标头。如需更多信息,请查看 MDN 上的Cache-Control header page。
- 用户代理可能会也可能不会获得新资源。这取决于
Cache-Control 标头、Expires 标头、资源是否陈旧、服务器是否使用验证器以及是否执行弱验证或强验证。如需更多信息,请查看 MDN 上的 HTTP conditional requests page。
- 服务器不提供
?randomquerystring 的资源。相反,客户端可以使用?randomquerystring 请求资源。 ?randomquerystring 被称为缓存破坏者。用户代理将执行新请求,但我听说某些代理可能会忽略该类型的缓存破坏器并仍返回缓存响应。
- 用户代理可能会尊重
Cache-Control 和Expires 标头。来自RFC 2616的相关摘录:
收到的带有任何其他状态代码(例如状态代码)的响应
302 和 307) 不得在对后续的回复中返回
请求,除非有缓存控制指令或其他
明确允许它的标头。例如,这些包括
以下:Expires 标头(第 14.21 节); “最大年龄”,
“s-maxage”、“must-revalidate”、“proxy-revalidate”、“public”或
“私有”缓存控制指令(第 14.9 节)。
有关 HTTP 缓存的更多信息,请查看 Ilya Grigorik 的 HTTP Caching 文章。