为啥重新加载我的页面后浏览器会再次获取图像?

Posted

技术标签:

【中文标题】为啥重新加载我的页面后浏览器会再次获取图像?【英文标题】:Why browsers fetch images again after reloading my page?为什么重新加载我的页面后浏览器会再次获取图像? 【发布时间】:2021-11-17 23:46:12 【问题描述】:

我正在开发一个网络应用程序,我希望将所有图像(价值几百 MB - 20 000 - 50 000 个缩略图)下载一次,并且不再下载,因为它们并没有真正改变。另外,这些图片是从 youtube 服务器下载的,我不想不必要地敲打他们的服务器。

但问题是,当我重新加载页面时,请求又开始下雨了,而不是加载缓存的图像。当我导航到我的页面并重新加载它时会发生这种情况,但是当我打开另一个页面并按回时,图像是从缓存中加载的。当我使用 javascript 动态添加新内容时,图像也会从缓存中加载。

那么,我错过了什么?

附:我正在使用地址栏附近的重新加载按钮重新加载,而不是使用 Ctrl+R 或其他清除缓存的组合键。

附言在有人对此之前澄清一下,我不会一次下载所有数千张图片

【问题讨论】:

请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。 【参考方案1】:

对于应用程序中不会更改的文件,您通常可以通过发送下面的响应头来添加主动缓存。这包括应用程序提供的静态文件,例如图像、CSS 文件和 JavaScript 文件。此外,另请参阅 Expires 标头。

Cache-Control: public, max-age=604800, immutable

MDN Documentation

【讨论】:

【参考方案2】:

要回答您的问题,最好的方法是创建一个 Web 服务器(使用 Node.js、ASP.NET Core、php 等)。您的服务器应将资源保存在一个具有最大使用期限的静态文件夹中。

【讨论】:

【参考方案3】:

浏览器使用Cache-Control HTTP header 来确定是否应从缓存中检索资产,或再次下载。

由于您是hotlinking YouTube 图片,您无法设置任何 HTTP 标头; YouTube 服务器确定缓存设置。

设置缓存设置最直接的方法是首先从 YouTube 下载图像并将它们保存在您自己的服务器上。然后,您可以在从服务器提供图像时设置 Cache-Control 标头。

对于来自 YouTube 的图片,另一个选项可能是 proxy the HTTP requests:

    浏览器从YourServer.com/image/123.png请求图片 YourServer.com 使用所需的缓存标头提供来自YouTube.com/img/123.png 的图像。 HTTP redirect 可能会起作用,但这可能会导致您的缓存标头被 YouTube 的缓存标头覆盖。您的服务器可能只需要从 YouTube.com 流式传输图像数据。 虽然图片来自 YouTube.com,但浏览器会认为图片是从 YourServer.com 提供的,并尊重您的缓存标头。

【讨论】:

以上是关于为啥重新加载我的页面后浏览器会再次获取图像?的主要内容,如果未能解决你的问题,请参考以下文章

页面重新加载后事件停止触发

ajax 请求后重新加载 dojo 小部件

为啥我的电脑打开除谷歌浏览器后自动转成IE的一个网页?

为啥我的 UIView 在重新加载后没有响应?

为啥当我滚动浏览 UITableView 时图像会不断调整大小?

如何在加载后强制 iFrame 重新加载