我有一个非常简单的问题,我一直无法找到明确的答案。我有一个动态生成的网页(所以我绝对不希望它被缓存),它加载了数千个图像。由于图像数量太多而且它们永远不会改变,因此我非常希望用户的浏览器能够缓存这些图像。
我按照此解决方案中的建议,将标题应用于HTML页面以防止缓存:How to control web page caching, across all browsers?
我的问题是:这会导致用户的浏览器也不会缓存此页面包含的任何图像,还是会缓存它们?谢谢。
答案 0 :(得分:1)
TL; DR 答案不明确,因为 很复杂。
在做“正确”事情的驱动器(即遵循自己已经改变的标准)和“改进”标准以实现更好的性能或更顺畅的导航体验之间存在着持续的斗争。用户。因此,从应用程序的角度来看,你需要正确使用诸如ETag,If-Modified-Since和Expires之类的标题,以及缓存提示编译指示,但浏览器 - 或者中间的某些东西,如代理 - 可能仍然决定覆盖什么是“明确的事情”。
在最新的Firefox上,直接连接到虚拟Ubuntu机器上的Apache 2.4,我尝试使用引用图像的页面(test.html)(test.jpg)。
当页面被缓存时,服务器端我看到HTML的单个请求而没有图像的任何内容。可能发生的事情是Firefox的“渲染”部分确实请求图像(它必须!),但这完全由本地缓存提供。这是有道理的;如果页面没有改变,其内容没有改变。
当页面不缓存时,我看到两个请求,一个用于页面,一个用于图像,服务器用304响应,但这是因为我还发送了图像的Last-Modified标头。这也是有道理的 - 如果页面已经更改,图像可能也已更改,因此浏览器必须知道是否是这种情况,并且只能通过询问服务器来执行此操作(除非{ {3}}标头用于“确保”客户端图像将不更改。)
我还没有尝试使用304响应的未缓存页面。出于同样的原因,我希望它生成一个请求(没有对服务器的图像请求)。
您可能想要考虑的是,您不会缓存HTML页面,但可能仍会执行一千个图像请求(这将产生一千个304,但仍然)。此类事件的性能取决于请求是通过使用Keep-Alive HTTP / 1.1扩展单独发送还是背靠背发送(必须启用并通告服务器端)。
然后,您应该使用图片上的Expires标头告诉客户这些资源不很快就会过时。
您可能也想探索不同的方法:
通过这种方式,您可以配置服务器以便在任何地方缓存所有内容,除非您确保无法通过单个制作的请求进行缓存。