是的,我的问题是我需要替换网站每个页面上显示的图像,这很好,问题是我希望每个用户都能看到新图像而不是旧图像的缓存版本。这是特别困难的,因为我不能进行任何代码更改(太多的地方可以做到它是可行的)所以我需要用一个同名的新服务器替换服务器上的图像。不仅如此,页面也很重,所以我不希望每次请求页面时都强制整个页面重新加载。
我认为最好的方法是在IIS中做一些事情,将新图像强制推送给任何尚未获得它的人。 Last-Modified或Expires HTTP标头,我的第一站,但我可以找到一种方法使它们对单个项目而不是整个页面起作用。
任何帮助/想法都会很棒!
谢谢,汤姆。
答案 0 :(得分:1)
我遇到了同样的问题并找到了这个解决方案:
$randy = md5( uniqid (rand(), 1) );
然后使你的形象像:
$profile_img = "<img src='$imageLocation2?$randy' border='0'/>";
echo $profile_img;
这会在jpg文件的末尾添加一个随机字符串,如?3984289040823,所以源代码看起来像这样:
<img src="example.jpg?3984289040823" />
现在每次加载页面浏览器都认为它是一个新图像并加载它。
答案 1 :(得分:0)
我认为唯一的方法就是使用HTTP标头。
我看到两个选项:
答案 2 :(得分:0)
IIS 应该根据文件本身设置最后修改的标题和/或etag,所以如果它仍在缓存,则浏览器可能行为不端,在这种情况下你会看到设置No-Cache pragma。参考文献:Microsoft KB reference,Section 14.9 of the HTTP1.1 spec
Elalfer的解决方案2可能会实现No-Cache pragma作为副产品。
答案 3 :(得分:0)
HTTP标头始终仅适用于一个项目。对于页面本身设置的情况,它们仅适用于页面而不适用于链接的资源。
野外的浏览器和HTTP缓存已经缓存了此映像的副本。没有办法强制他们重新加载图像而不改变图像的URL(你已经声明不能这样做)。
如果这是您更换此图片的唯一时间,或者您希望此类更改不常见,则只需更改图像,最终网络将缓存新图像。 Web服务器将通知检查更新版本的浏览器时间戳已更改。
要进行更持久的更改,您需要调查IIS如何为静态文件设置标头。我怀疑它为所有文件统一设置了所有标头,但是可能有一种方法可以覆盖特定文件的标头。如果没有,您应该能够在脚本中包装该URL的请求,该脚本在传递内容之前设置标头。在这种情况下,您要做的是设置Expires或max-age标头,以便浏览器知道他们应该将此项保留在缓存中的时间。请注意,这些标头仅适用于此文件的未来请求。
将这些标题放在页面本身不会影响对文件的请求。添加缓存控制标头时要小心,因为如果错误的东西被过度缓存,您的网站可能无法正常运行;或者,你的带宽可能会因为没有被缓存的内容而飙升。
为了将来考虑,您应该可以在内容更改时更改静态资源的路径。这使得浏览器清楚地知道该文件是新的,因为路径中没有该URL。例如:
www.yoursite.com/images/v1/logo.png
变为
www.yoursite.com/images/v2/logo.png
一旦logo.png更改为v2。然后,在引用logo.png的页面中,您可以使用代码自动在页面中写入正确的URL。这样,文件的每个版本都有一个唯一的名称,因此永远不会与以前的任何缓存版本冲突。