为某些图像禁用caching

我使用PHP库生成一些图像。

有时浏览器不加载新生成的文件。

我如何禁用caching只为我dynamic创build的图像?

注意:随着时间的推移,我必须使用相同的名称创build图像。

这个问题的常见和简单的解决scheme,感觉像一个黑客,但相当便携是为每个请求添加一个随机生成的查询stringdynamic图像。

所以,例如 –

<img src="image.png" /> 

会成为

 <img src="image.png?dummy=8484744" /> 

要么

 <img src="image.png?dummy=371662" /> 

从Web服务器的angular度来看,访问同一文件,但从浏览器的angular度来看,不能执行caching。

在服务页面时,随机数字的生成可以发生在服务器上(只要确保页面本身没有被caching…),或者在客户端(使用JavaScript)。

您将需要validation您的networking服务器是否可以应付这个技巧。

浏览器caching策略可以通过HTTP头来控制。 请记住,他们只是一个暗示,真的。 由于浏览器在这个(以及其他)字段中非常不一致,所以您需要多个标题才能在一系列浏览器上获得所需的效果。

  header("Pragma-directive: no-cache"); header("Cache-directive: no-cache"); header("Cache-control: no-cache"); header("Pragma: no-cache"); header("Expires: 0"); 

如果您需要在浏览器中使用JavaScriptdynamic地执行此操作,请使用以下示例…

 <img id=graph alt="" src="http://www.kitco.comhttp://img.dovov.comlive/gold.gif" /> <script language="javascript" type="text/javascript"> var d = new Date(); document.getElementById("graph").src = "http://www.kitco.comhttp://img.dovov.comlive/gold.gif?ver=" + d.getTime(); </script> 

解决scheme1不是很好。 它确实有效,但在图像文件的末尾添加随意或时间戳的查询string是不可扩展的,并且会使浏览器重新下载并caching发送的每个图像的每个版本。

解决scheme2是无用的。nocache头添加到图像文件不仅非常难以实现,而且完全不切实际,因为它要求您提前预测需要的时间,第一次加载任何您认为可能会在未来。

inputEtags …

我发现解决这个问题的绝对最好的方法是在图像目录中的.htaccess文件中使用ETAGS 。 以下告诉Apache在图像文件头中向浏览器发送一个唯一的散列。 这个散列只有在图像文件被修改的时候才会改变,并且这个改变触发浏览器在下一次请求时重新加载图像。

 <FilesMatch "\.(jpg|jpeg)$"> FileETag MTime Size </FilesMatch> 

我知道这个话题已经很久了,但是它在Google中排名很好。 我发现把这个放在你的标题里效果很好。

 <meta Http-Equiv="Cache-Control" Content="no-cache"> <meta Http-Equiv="Pragma" Content="no-cache"> <meta Http-Equiv="Expires" Content="0"> <meta Http-Equiv="Pragma-directive: no-cache"> <meta Http-Equiv="Cache-directive: no-cache"> 

更改图像源是解决scheme。 你确实可以通过给图像添加一个时间戳或随机数。

最好是添加一个校验和,例如图像所代表的数据。 这可以实现caching。

我检查了所有的答案,最好的答案似乎是(不是):

 <img src="image.png?cache=none"> 

首先。

但是,如果添加cache = none参数(这是静态的“无”字),则不起作用,浏览器仍然从caching中加载。

解决这个问题的方法是:

 <img src="image.png?nocache=<?php echo time(); ?>"> 

你基本上添加unix时间戳使参数dynamic和没有caching,它的工作。

但是,我的问题有点不同:我正在加载生成的PHP图表图像,并用$ _GET参数控制页面。 当URL GET参数保持不变时,我希望从caching中读取图像,并且在GET参数更改时不caching。

为了解决这个问题,我需要散列$ _GET,但是因为它是数组,所以解决scheme是:

 $chart_hash = md5(implode('-', $_GET)); echo "<img src='http://img.dovov.commychart.png?hash=$chart_hash'>"; 

编辑

虽然上面的解决scheme工作得很好,但有时候您想要提供caching的版本,直到文件被更改。 (使用上面的解决scheme,它会完全禁用该映像的caching)因此,要从浏览器提供caching的映像直到映像文件的使用发生更改:

 echo "<img src='http://img.dovov.commychart.png?hash=" . filemtime('mychart.png') . "'>"; 

filemtime()获取文件修改时间。

我只是在寻找一个解决办法,上面的答案在我的情况下是行不通的(我没有足够的声誉评论他们)。 事实certificate,至less对于我使用的浏览器(OSX上的Chrome),似乎阻止caching的唯一方法是:

 Cache-Control = 'no-store' 

为了完整性,我现在使用全部3个“无caching,无存储,必须重新validation”

所以在我的情况下(从Python的瓶颈提供dynamic生成的图像)​​,我不得不做以下工作,希望在尽可能多的浏览器工作…

 def make_uncached_response(inFile): response = make_response(inFile) response.headers['Pragma-Directive'] = 'no-cache' response.headers['Cache-Directive'] = 'no-cache' response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate' response.headers['Pragma'] = 'no-cache' response.headers['Expires'] = '0' return response 

我用这个来解决我的类似问题…显示图像计数器(来自外部提供者)。 它并没有正确刷新。 而随机参数添加后,所有工作正常:)

我附加了一个datestring,以确保每分钟至less刷新一次。

示例代码(PHP):

 $output .= "<img src=\"http://xy.somecounter.com/?id=1234567890&".date(ymdHi)."\" alt=\"somecounter.com\" style=\"border:none;\">"; 

这导致一个src链接,如:

 http://xy.somecounter.com/?id=1234567890&1207241014 

如果您有一个硬编码的图片url,例如: http : //example.com/image.jpg,您可以使用php为图片添加标题。

首先,你将不得不让Apache处理您的JPG作为PHP。 看到这里: 是否有可能执行扩展名为file.php.jpg的PHP?

从文件加载图像(imagecreatefromjpeg),然后添加以前答案的标题。 使用php函数标题添加标题。

然后用imagejpeg函数输出图像。

请注意,让php处理jpg图像是非常不安全的。 另外请注意,我还没有testing过这个解决scheme,所以这取决于你的工作。

我有这个问题,并克服这样的。

 var newtags='<div class="addedimage"><h5>preview image</h5><img src="'+one+'?nocache='+Math.floor(Math.random() * 1000)+'"></div>'; 

很简单,发送一个标题位置。

我的网站,包含一个图像,上传图像后,没有改变,然后我添加此代码:

 <?php header("Location: pagelocalimage.php"); ?> 

工作对我来说。

让我们再添加一个解决scheme。

在最后添加一个唯一的string是一个完美的解决scheme。

 example.jpg?646413154 

以下解决scheme扩展了此方法,并在更新映像时提供cachingfunction并获取新版本。

当图像更新时, filemtime将被更改。

 <?php $filename = "path/tohttp://img.dovov.comexample.jpg"; $filemtime = filemtime($filename); ?> 

现在输出图像:

 <img src="images/example.jpg?<?php echo $filemtime; ?>" >