5

我正在使用这样的链接存储和缓存图像

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> 

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

4

2 回答 2

5

展望未来,ETag应该可以毫不费力地满足您的需求。ETags 应该默认工作,所以你真的不需要做任何事情,但是为了避免在多服务器环境中出现问题,你可以配置你的 ETags 来计算文件大小和最后修改的时间戳。例如,将现有指令替换为您.htaccess或 Apache 配置中的以下行:

FileETag MTime Size

当图像更改时,ETag 将有效地自动“过期”缓存的图像。缺点是浏览器仍然会在每个请求中查询资源,因此它的效率比您使用的过期指令低一点。另一方面,ETags 避免了您描述的问题。

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

于 2012-11-20T23:17:41.193 回答
2

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

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

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

请注意,这会使您的网站在访问这些图像时变慢。文件仍将被缓存,但浏览器将检查服务器以查看它们是否已更改(If-Modifed-Since)。增加 max-age(以秒为单位)以牺牲陈旧性为代价提高性能。

(顺便说一句,“max-age=0, must-revalidate”是一个更好的值,但是浏览器错误地实现了规范。must-revalidate 可能会禁用某些浏览器和代理中的缓存。)

另请参阅https://stackoverflow.com/a/1383359/1205867

于 2012-11-21T03:02:53.437 回答