1

是否有任何方法(服务器或客户端)强制浏览器从服务器中提取新版本的文件(图像)。有问题的图像会被缓存很长时间。我知道我可以在图像的 URL 中附加一个随机数,但在这种情况下这是不可接受的。我需要从完全相同的URL 刷新图像。

我在做什么:一个类似于 YouTube 的门户,用户可以在其中上传视频。每个视频都有一个缩略图,显示在门户网站的各个页面上。用户可以随时更改缩略图(他可以从三个生成的缩略图中进行选择)。因此,当这种情况发生时(新图像覆盖“原始”图像),我不想刷新视频的缩略图,以便所有者(我不在乎其他用户是否看到旧缩略图)无论如何都会看到新缩略图显示缩略图的位置。

恐怕这无法完成,但我在这里问只是为了确定。

更新:我在服务器端使用 nginx 和 PHP

4

2 回答 2

4

您可以在缩略图上使用ETAG。如果实际缩略图数据没有改变(即仍然具有相同的散列),这将阻止实际缩略图数据的传输。但是,您仍然会面对客户端 HTTP 请求来检查 ETAG 是否已更改(通常由 HTTP 304 响应。

但是结合相当短的新鲜度阈值(比如几分钟),您可以在缓存和新鲜度之间进行权衡,同时仍然节省资源。如果你需要绝对新鲜,你可能不得不坚持使用 ETAG。如果您创建了一个聪明的哈希函数,您可以在前端负​​载均衡器(或至少靠近它)上处理 ETAG 请求,因此可能相当便宜。

编辑:从我的其他评论中添加替代方案。

另一种方法是在资源按照另一个答案中的建议更改时使用添加的请求参数来强制重新获取。该模式的一个变体(许多 Rails 应用程序使用)是将最后一次更改的时间戳(或某种散列)作为参数附加到文件中,该参数仅在文件实际更改时才会更改。像这样的方法,或上述方法之一,实际上是真正确保没有不必要的缓存验证请求同时始终拥有最新资源的唯一方法。

于 2011-02-17T11:37:03.393 回答
0

在文件名末尾添加一个 get 参数,例如:

example.jpg?refresh=yesplease

您还可以使用 rand() 参数在每次访问时刷新该图像。在 php 中:

example.jpg?refresh=<?php echo rand(1,999); ?>
于 2011-02-17T11:26:21.847 回答