将md5-string添加到图像URL值得吗?

时间:2012-12-10 08:47:54

标签: php caching md5 etag md5-file

我正在通过PHP动态生成页面。我使用网站的输出字符串生成Etag,并检查自上次请求后网站未更改时发送304(未修改)。

我现在正在尝试改进我网站上图片的缓存。每个站点上有6到30张图片(jpg,70 - 200 KB)。我希望用户在内容发生变化时重新加载图片。我正在考虑通过为每个图片的URL添加查询字符串来实现这一点:

src="'.$files[$x].'?id='.md5_file($files[$x]).'"

这是否太复杂,每次请求都会产生太多工作量,还是值得的? 正如我所说:我为每个图像生成md5-hashs,然后为输出字符串生成一个md5-hash,以便在每个请求中将其用作Etag。

这些是我图片中的响应标题:

HTTP/1.1 304 Not Modified
Date: Mon, 10 Dec 2012 08:56:49 GMT
Server: Apache
Connection: keep-alive, Keep-Alive
Keep-Alive: timeout=1, max=99
ETag: "360f-4d02f5fcfc34f"
Expires: Mon, 07 Jan 2013 08:56:49 GMT
Cache-Control: max-age=2419200, must-revalidate

非常感谢!

1 个答案:

答案 0 :(得分:1)

使用基于时间的缓存标头意味着客户端根本不会询问服务器文件是否已更新一段时间。
使用Etag缓存标头意味着客户端每次都会询问服务器,但每次都不需要传输数据。

这两种方法各有利弊。对于很少更改的资产,您应该使用基于时间的缓存标头,因为这会从您的服务器中承担大量负载。要在更新后立即更新,请在其URL中添加唯一标记是个好主意。对于经常更新的资产,使用没有基于时间的缓存头(或非常短暂的缓存头)的Etags是一个好主意,因为这意味着他们会在更新时立即更新,同时仍然从服务器上卸载。通常,您希望对动态网站页面进行Etag 并对图像资源进行时间缓存。

所以,是的,在静态时间缓存资产的URL中添加md5哈希值是一个好主意,如果客户端下载更新版本ASAP是一个真正的问题。确保添加这些哈希值并不比您保存的更多。