为某些图像禁用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; ?>" >