浏览器缓存如何处理热链接图像+ 204响应?

时间:2016-12-24 23:38:12

标签: .htaccess caching browser-cache http-status-code-204

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

p = subprocess.Popen(args=[sys.executable, '-m', 'pdb', 'mide.py'],
                 stdin=subprocess.PIPE,
                 stdout=subprocess.PIPE,
                 stderr=subprocess.PIPE,
                 universal_newlines=True)
p.communicate('s')
p.communicate('s')# I know why this line doesn't work, it's just a example how i wanted to do it.
  1. 假设所有相关方都启用了浏览器缓存,那么 这个图像被缓存(也就是来自外部网站的图像甚至可缓存)?
  2. 如果外部服务器决定在同一文件位置提供不同的图像,比如.htaccess重写,那么缓存会被破坏吗?
  3. 如果外部服务器决定使用a提供相同的图像 此后<img src="externalserver.com/catpic.png"> ,缓存会被破坏吗?
  4. 如果外部服务器响应HTTP状态代码204 实际上提供图像,缓存会发生什么?
  5. 谢谢!祝你们节日快乐。

1 个答案:

答案 0 :(得分:1)

一切都取决于。

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

    与任何其他状态代码(例如状态代码)一起收到的回复   302和307)不得在对后续的回复中返回   请求,除非有缓存控制指令或其他   明确允许它的标头。例如,这些包括   以下:一个Expires标题(第14.21节); a&#34; max-age&#34;,   &#34; s-maxage&#34;,&#34;必须重新验证&#34;,&#34;代理重新验证&#34;,&#34;公共&#34;要么   &#34;私人&#34; cache-control指令(第14.9节)。

  5. 有关HTTP缓存的更多信息,请查看Ilya Grigorik撰写的HTTP Caching文章。