什么是 ETag 和 Last-Modified?如何使用?

推荐答案

ETag

ETag(Entity Tag)是HTTP协议中用于标识资源版本的机制。它是一个字符串,通常由服务器生成,用于唯一标识资源的特定版本。当资源发生变化时,ETag也会随之改变。客户端可以通过If-None-Match请求头将ETag发送给服务器,服务器会检查ETag是否匹配当前资源的版本。如果匹配,服务器会返回304 Not Modified状态码,表示资源未修改,客户端可以使用缓存中的资源。

Last-Modified

Last-Modified是HTTP协议中用于标识资源最后修改时间的机制。它是一个日期时间字符串,表示资源最后一次被修改的时间。客户端可以通过If-Modified-Since请求头将Last-Modified时间发送给服务器,服务器会检查资源是否在该时间之后被修改过。如果没有修改,服务器会返回304 Not Modified状态码,表示资源未修改,客户端可以使用缓存中的资源。

如何使用

  1. ETag的使用

    • 服务器在响应头中包含ETag字段。
    • 客户端在后续请求中通过If-None-Match请求头发送ETag。
    • 服务器比较客户端发送的ETag与当前资源的ETag,决定是否返回304状态码。
  2. Last-Modified的使用

    • 服务器在响应头中包含Last-Modified字段。
    • 客户端在后续请求中通过If-Modified-Since请求头发送Last-Modified时间。
    • 服务器比较客户端发送的Last-Modified时间与当前资源的最后修改时间,决定是否返回304状态码。

本题详细解读

ETag的详细解读

ETag是HTTP协议中用于缓存验证的机制之一。它的主要作用是帮助服务器和客户端判断资源是否发生了变化。ETag可以是任意字符串,但通常由服务器根据资源内容生成,以确保唯一性。ETag的生成方式可以是内容的哈希值、版本号等。

当客户端首次请求资源时,服务器会在响应头中包含ETag字段。客户端在后续请求中,可以通过If-None-Match请求头将ETag发送给服务器。服务器会检查客户端发送的ETag是否与当前资源的ETag匹配。如果匹配,说明资源未发生变化,服务器会返回304状态码,客户端可以使用缓存中的资源。如果不匹配,服务器会返回新的资源内容。

ETag的优势在于它可以精确地标识资源的版本,即使资源的修改时间没有变化,ETag也能反映出资源内容的变化。然而,ETag的生成和比较可能会增加服务器的计算负担。

Last-Modified的详细解读

Last-Modified是HTTP协议中另一种用于缓存验证的机制。它通过记录资源的最后修改时间来判断资源是否发生了变化。服务器在响应头中包含Last-Modified字段,客户端在后续请求中可以通过If-Modified-Since请求头将Last-Modified时间发送给服务器。

服务器会检查客户端发送的Last-Modified时间是否早于当前资源的最后修改时间。如果早于,说明资源未发生变化,服务器会返回304状态码,客户端可以使用缓存中的资源。如果晚于或等于,服务器会返回新的资源内容。

Last-Modified的优势在于它简单易用,且不需要额外的计算开销。然而,Last-Modified的精度受限于时间戳的粒度,且无法处理资源内容未变但修改时间变化的情况。

使用场景

  • ETag:适用于资源内容频繁变化但修改时间不敏感的场景,或者需要精确控制缓存验证的场景。
  • Last-Modified:适用于资源内容变化不频繁且修改时间可以准确反映资源变化的场景。

在实际应用中,ETag和Last-Modified可以结合使用,以提供更灵活的缓存验证机制。

纠错
反馈