将md5字符串添加到图像URL值得吗



我正在用PHP动态生成一个页面。我正在使用网站的输出字符串来生成一个Etag,并检查它,当网站自上次请求以来没有更改时,发送一个304(未修改)。

我现在也在努力改善我网站上图片的缓存。每个站点上有6到30张图片(jpg,70-200 KB)。如果图片内容发生更改,我希望用户重新加载图片。我正在考虑通过在每张图片的URL中添加一个查询字符串来实现这一点:

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

这是不是太复杂了,每个请求都会产生太多的工作量,还是值得?正如我所说:我为每个图像生成那些md5散列,然后为输出字符串生成一个md5散列以在每个请求中将其用作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

非常感谢!

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

这两种方法各有利弊。对于很少更改的资产,您应该使用基于时间的缓存头,因为这将占用服务器的大量负载。要在更新后立即更新这些内容,最好在其URL中添加一个唯一的令牌。对于经常更新的资产,使用没有基于时间的缓存头(或寿命很短的缓存头)的Etag是一个好主意,因为这意味着它们会在更新后立即更新,同时仍然减轻服务器的负载。通常,您希望Etag您的动态网页和时间缓存您的图像资产。

因此,如果让客户端尽快下载更新版本是一个真正的问题,那么在静态时间缓存资产的URL中添加md5哈希是一个好主意。确保添加这些散列不会比节省更多的开销。

最新更新