繁体   English   中英

缓存的图片问题

[英]Cached image problem

是的,我的问题是我需要替换出现在站点每一页上的图像,这很好,问题是我希望每个用户都可以看到新图像,而不是旧图像的缓存版本。 这变得特别困难,因为我无法进行任何代码更改(要想使它可行,要在太多地方进行更改),因此我需要用相同名称的新服务器替换服务器上的映像。 不仅如此,页面也很沉重,所以我不想每次请求页面时都强制整个页面完全重新加载。

我认为最好的方法是在IIS中执行某些操作,以将新映像强加给尚未拥有该映像的任何人。 Last-Modified或Expires HTTP标头是我的第一站,但我可以找到一种方法使它们适用于单个项目而不是整个页面。

任何帮助/想法都太棒了!

谢谢,汤姆。

我遇到了同样的问题,并找到了以下解决方案:

$randy = md5( uniqid (rand(), 1) );

然后使您的图像像:

$profile_img = "<img src='$imageLocation2?$randy' border='0'/>";

echo $profile_img;

这会在jpg文件的末尾放置一个随机字符串,例如?3984289040823,因此源代码将如下所示:

<img src="example.jpg?3984289040823" />

现在,每次加载页面时,浏览器都会认为这是一个新图像并进行加载。

我相信唯一的方法就是使用HTTP标头。

我看到两个选择:

  1. 将标头添加到文件。 我对IIS不太了解,但是我认为他们有这样的选择。
  2. 用脚本(php或C#)替换图像,在代码中手动添加标题并发送图像

IIS 应该根据文件本身来设置最后修改的标头和/或etag,因此,如果仍在缓存,则浏览器的行为可能不正确,在这种情况下,您将希望设置No-Cache编译指示。 参考: Microsoft KB参考HTTP1.1规范的14.9节

Elalfer的解决方案2可能会实现副产品No-Cache实用性。

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。 这样,文件的每个修订版都具有唯一的名称,因此不会与任何先前缓存的版本冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM