是否有任何方法(服务器或客户端)强制浏览器从服务器中提取新版本的文件(图像)。有问题的图像会被缓存很长一段时间。我知道我可以将一个随机数添加到图像的URL中,但在这种情况下这是不可接受的。我需要从完全相同的网址刷新图片。
我在做什么:像用户上传视频的YouTube门户网站。每个视频都有一个缩略图,显示在门户网站的各个页面上。用户可以随时更改缩略图(他可以从三个生成的缩略图中进行选择)。所以当发生这种情况时(新图像会覆盖'原始'图像),我不想刷新视频的缩略图,以便所有者(我不在乎其他用户是否看到旧缩略图)将看到新的缩略图无论如何显示缩略图的位置。
我担心这不可能做到,但我在这里只是为了确定。
更新:我在服务器端使用nginx和PHP
答案 0 :(得分:4)
您可以在缩略图上使用ETAGs。如果实际缩略图数据没有改变(即仍然具有相同的散列),这将阻止实际缩略图数据的传输。但是,您仍然会面对客户端HTTP请求以检查ETAG是否已更改(通常由HTTP 304回答。
但结合相当短的新鲜度阈值(比如几分钟),您可以在缓存和新鲜度之间进行权衡,同时仍然节省资源。如果你需要绝对的新鲜度,你可能不得不坚持使用ETAG。如果你创建一个聪明的哈希函数,你可以处理你的前端负载均衡器(或至少在它附近)的ETAG请求,因此可能相当便宜。
编辑:从我的其他评论中添加替代。
另一种方法是使用添加的请求参数,以便在资源按照另一个答案中的建议进行更改时强制重新获取。该模式的一种变体(许多Rails应用程序使用)是将最后一次更改(或某种类型的哈希)的时间戳作为参数附加到文件中,该文件仅在文件实际发生更改时才会更改。像这样的东西,或上述方法之一,实际上是确保没有不必要的缓存验证请求,同时始终拥有最新资源的唯一方法。
答案 1 :(得分:-1)
在文件名末尾添加一个get参数,例如:
example.jpg?refresh=yesplease
您还可以使用rand()参数刷新每次访问的图像。 在php:
example.jpg?refresh=<?php echo rand(1,999); ?>