如何防止浏览器缓存图像


How to prevent browsers from caching an image?

我的网站上有一张我不想缓存的图像。该图像在CSS中用作背景,因此我无法动态更改其名称。有什么想法吗?

另一种选择是在图像文件后添加一个随机字符串。

<img src="/path/to/image/image.jpg?<?php echo time(); ?>/>

这应确保每次显示页面时都重新加载图像。

MNOT 有一个很好的缓存教程,它将解释如何设置 HTTP 标头以请求不缓存图像(请记住,您需要为图像设置 HTTP 标头,而不是 HTML 文档)。

这可能是一个坏主意,因为图像往往相对笨重,因此为每个页面重新下载它可能会显着降低性能。

使用 apache 时,您无法通过 2 种不同的方式实现这一目标:

mod_headers:

<FilesMatch "'.(png|jpg|jpeg|jpeg)$">
Header set Expires "Fri, 04 Aug 1978 12:00:00 GMT"
Header set Cache-Control "no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, no-transform"
Header set Pragma "no-cache"
</FilesMatch>

或mod_expires:

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresByType image/png A0
  ExpiresByType image/gif A0
  ExpiresByType image/jpg A0
  ExpiresByType image/jpeg A0
</IfModule>

如果你不能在 Apache 上设置缓存规则(正如 @David Dorvard 的回答所建议的那样 - 参见使用 <Files 指令的部分),你可以通过 PHP 脚本管道传输图像,并在那里设置你自己的(no)缓存标头:

<?php 
header('Cache-Control: no-cache');
header('Expires: 0');
header('Content-Type: image/jpeg'); // or whatever your image is
readfile('/some/path/to/yourfile.jpg');
?>

应该会给你一个根本没有缓存的图像;强调应该,因为各种浏览器都有不同的破坏(IIRC IE6在作为背景图像链接时无论如何都会缓存它,但幸运的是,它正在消失)。

请注意,这种简单的方法将 1) 增加服务器上的负载,因为它需要为图像请求启动 PHP,以及 2) 禁用脚本/映像上的部分下载

如果您的目标是现代浏览器,则可以使用 HTML5 清单文件:http://diveintohtml5.ep.io/offline.html#network