如何强制Web浏览器不缓存图像
背景
我正在为两个公益网站编写并使用一个非常简单的基于CGI(Perl)的内容管理工具。 它为网站管理员提供HTML表单,用于填充字段(日期,地点,标题,描述,链接等)并保存它们的事件。 在该表单上,我允许管理员上传与该事件相关的图像。 在显示表单的HTML页面上,我还展示了上传图片的预览(HTML img标签)。
问题
管理员想要更改图片时发生问题。 他只需点击“浏览”按钮,选择一张新照片并按下确定。 这工作正常。
一旦图像上传,我的后端CGI将处理上传并正确地重新载入表单。
问题是显示的图像没有刷新。 即使数据库保存了正确的图像,旧图像仍会显示。 我已经缩小到了网页浏览器中的IMAGE IS CACHED这一事实。 如果管理员点击Firefox / Explorer / Safari中的RELOAD按钮,则所有内容都会刷新并显示新图像。
我的解决方案 - 不工作
我试图通过写一个HTTP Expires指令来控制缓存,这个指令的日期很远。
Expires: Mon, 15 Sep 2003 1:00:00 GMT
请记住,我在管理方面,我并不在乎这些页面是否需要稍长的时间才能加载,因为它们总是过期。
但是,这也行不通。
笔记
上传图片时,其文件名不保存在数据库中。 它被重新命名为Image.jpg (当使用它时简单地说出来)。 当用新的图像替换现有的图像时,名称也不会改变。 只是图像文件的内容发生变化。
网络服务器由主机服务/ ISP提供。 它使用Apache。
题
有没有办法强制网页浏览器不缓存从这个页面的东西,甚至没有图像?
我在用数据库实际“保存文件名”的选项。 这样,如果图像改变了,IMG标签的src也会改变。 但是,这需要整个网站进行很多更改,如果我有更好的解决方案,我宁愿不这样做。 另外,如果上传的新图像具有相同的名称(例如,图像被稍微拍了一下并重新上传),这仍然不起作用。
Armin Ronacher有正确的想法。 问题是随机串可能会发生碰撞。 我会用:
<img src="picture.jpg?1222259157.415" alt="">
其中“1222259157.415”是服务器上的当前时间。 (注意:我使用python的time.time()来生成)
简单修复:将随机查询字符串附加到图像:
<img src="foo.cgi?random=323527528432525.24234" alt="">
HTTP RFC说:
Cache-Control: no-cache
但那并不是那么好:)
我使用PHP的文件修改时间函数,例如:
echo <img src='Images/image.png?" . filemtime('Images/image.png') . "' />";
如果您更改图像,则使用新图像而不是缓存图像,原因是具有不同的修改时间戳。
链接地址: http://www.djcxy.com/p/55735.html