0

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

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

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

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

非常感谢你!

4

1 回答 1

1

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

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

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

于 2012-12-10T09:23:01.967 回答