我遇到一个问题,用户报告说他们上传的图像没有成功,旧的图像仍然存在。经过仔细检查,新的图像已经被成功上传,只是它们的文件名与旧的相同。在上传时,为了SEO目的,我对图像进行了重命名操作。当用户删除图像后,原来的索引变得可用并被重复使用,因此会有相同的图像名称。
有没有一种方法(我认为可能会有一个meta标签可以实现)能够告诉浏览器不要使用缓存?
更好的解决方案是将图像重新命名为全新的名称。我将着手解决这个问题,但同时也提供了一个快速解决方案,即重新命名图像文件来代替重复利用原有名称的方式。
我遇到一个问题,用户报告说他们上传的图像没有成功,旧的图像仍然存在。经过仔细检查,新的图像已经被成功上传,只是它们的文件名与旧的相同。在上传时,为了SEO目的,我对图像进行了重命名操作。当用户删除图像后,原来的索引变得可用并被重复使用,因此会有相同的图像名称。
有没有一种方法(我认为可能会有一个meta标签可以实现)能够告诉浏览器不要使用缓存?
更好的解决方案是将图像重新命名为全新的名称。我将着手解决这个问题,但同时也提供了一个快速解决方案,即重新命名图像文件来代替重复利用原有名称的方式。
在任意URL后添加查询字符串,例如唯一数字、时间、版本号等:
<img src="image.png?80172489074" alt="a cool image" />
由于URL不同,这将导致一个新的请求。
这很困难。你确实希望图片被缓存,但一旦有新的可用的图片,你又不希望它们被缓存:
解决方案?我能想到两个好的选项:
filemtime(string $filename)
函数。这样,每次请求的文件发生更改时,该文件的URL都会更改。(感谢黑客Michael Krelin)。 - RicoBrassers我最喜欢的PHP解决方案:
<img src="<?php echo "image.jpg" . "?v=" . filemtime("image.jpg"); ?>" />
每次文件更改都会创建该文件的新版本
<img src="yourImage.png?v=<?php echo Date("Y.m.d.G.i.s")?>" />
<img src="image.jpg?<?=rand(1,1000000)?>">
<meta>
标签中使用 http-equiv
,告诉浏览器不要使用缓存(或者更好的方式是以某种定义好的方式使用它),但最好的方法是配置服务器以发送正确的 http cache
头部信息。请查看关于缓存的文章。http
标准,但我相信这是正确的方法。另一个强大的解决方案:
<img src="image.png?v=<?php echo filemtime("image.png"); ?>" />
打印出路径上的“最后修改时间戳”。
新版本-->下载新镜像
相同版本-->使用缓存的镜像
通过调整HTTP头,您可以控制缓存行为。
将过期时间设置为过去会强制浏览器不使用缓存版本。
Expires: Sat, 26 Jul 1997 05:00:00 GMT
您可以参考RFC获取更多细节。
GET
请求中使用If-Modified-Since
头部。结果仍然相同 - 确保正确报告文件的修改时间,以便缓存失效工作正常。 - Toby Speight在PHP中,您可以使用这个技巧
<img src="image.png?<?php echo time(); ?>" />
time()函数显示当前时间戳。每次页面加载都是不同的。因此,这段代码欺骗了浏览器:它读取另一个路径,并且“认为”自上次用户访问该站点以来图像已更改。因此,它必须重新下载它,而不是使用缓存文件。