2012-11-11 49 views
4

我存储和缓存的图片与链接这样缓存图像,但更新的变化

http://example.com/1.jpg 
http://example.com/2.jpg 

用户必须修改和覆盖1.jpg2.jpg能力。所以我想要缓存所有图像,但更新刚被覆盖的图像文件的缓存。 现在,我使用.htaccess方法缓存

<IfModule mod_expires.c> 
ExpiresActive On 
<FilesMatch "(?i)^.*\.(jpg|jpeg|png)$"> 
ExpiresDefault "access plus 1 year" 
</FilesMatch> 
</IfModule> 

但使用这种方法的图像仍保持不变,即使用户覆盖该文件。

+3

对[条件请求]使用'ETag'标头(https://en.wikipedia.org/wiki/HTTP_ETag)。 – 2012-11-11 18:08:23

+0

用户如何访问这些图像?通过一个带有''标签的HTML页面?如何生成HTML页面? – vladr

+0

@ user647772 - 请发表您的建议作为答案,我会授予赏金;除非明天有人提出更好的答案。 – WEFX

回答

4

未来,ETag s应该没有进一步的努力服务您的需求。 ETags应该默认工作,所以你并不需要做任何事情,但为了避免在多服务器环境中出现问题,你可以配置你的ETag,以便根据文件大小和上次修改的时间戳进行计算。例如,在你的.htaccess或Apache配置替换以下行现有的指令:

FileETag MTime Size 

的eTag将有效地“过期”的形象变化的时候,缓存图像自动。缺点是浏览器仍然会对每个请求查询资源,所以它比您使用的过期指令效率稍低。另一方面,ETags避免了你所描述的问题。

但是,如果您已经按照您的问题所述使用了其中一个缓存指令,并将Expires的值设置为将来的某个值,那么任何请求该文件的浏览器都不会再检查它一段时间。你可以通过在URL上附加一个简单的查询字符串(如?cache=123)来使其不同(从而绕过缓存)。那么你将来可以依靠ETag机制。

1

这个问题很可能不在服务器上,而是在浏览器上。浏览器不检查服务器是否更改图像。你所做的并不完全解决这个问题。

以下将告诉浏览器始终检查服务器的更改。

<IfModule mod_headers.c> 
    <FilesMatch "(?i)^.*\.(jpg|jpeg|png)$"> 
    Header set Cache-Control "max-age=0" 
    </FilesMatch> 
</IfModule> 

请注意,访问这些图片时,这会让您的网站变慢。这些文件仍然会被缓存,但浏览器将检查服务器以查看它们是否已更改(If-Modifed-Since)。增加最大年龄(以秒为单位),以牺牲过时性为代价来提高性能。

(顺便说一句,“最大年龄= 0,必重新验证”是一个更好的价值,但浏览器已经misimplemented规范。必重新验证可能会在某些浏览器和代理禁用缓存。)

参见https://stackoverflow.com/a/1383359/1205867