HTTP协议中的ETag和Last-Modified是标准HTTP头部,被用于实现Web缓存和优化,下面我们详细讲解一下它们的作用以及使用场景。
ETag
ETag是Entity Tag(实体标签)的缩写,它是一个由服务器生成的标识符,用于表示资源的特定版本。当客户端请求资源时,服务器会在响应头部添加一个ETag,客户端下次请求该资源时可以带上该ETag,服务器会根据该ETag进行比对,如果资源内容发生变化,则返回新的资源内容,否则返回状态码304,表示未修改。
ETag的作用主要有两个方面:一是避免未修改的资源重复传输,节省带宽和服务器资源;二是有效地控制Web缓存,可以保证客户端始终获得最新的资源版本。
以下是一个简单的示例,展示了如何使用ETag头来实现缓存控制。
GET /example.html HTTP/1.1
If-None-Match: "3ed-3ab-r8ea6rhgth"
在这个示例中,客户端请求example.html资源,并携带了上次请求时收到的ETag头的值”3ed-3ab-r8ea6rhgth”。如果服务器检测到该资源未发生变化,则可以直接返回304状态码,表示资源未修改。
Last-Modified
Last-Modified是表示资源最后修改时间的HTTP头部。浏览器请求资源时,如果该资源在服务器端的最后修改时间早于客户端上次接收到的最后修改时间,则服务器返回304状态码,否则返回带有新的Last-Modified头部的资源内容。
与ETag相比,Last-Modified更加直观,同时也可以提供与时间相关的信息来检验资源的更新状态。
GET /example.html HTTP/1.1
If-Modified-Since: Tue, 09 Jul 2019 07:18:52 GMT
在这个示例中,客户端请求example.html资源,并携带了上次请求时收到的Last-Modified头部的值”Tue, 09 Jul 2019 07:18:52 GMT”。如果服务器检测到该资源的最后修改时间早于这个时间,则可以直接返回304状态码,表示资源未修改。
总之,ETag和Last-Modified都可以用于Web缓存和优化,它们都可以让客户端避免下载未修改的资源,节省带宽和服务器资源。但是ETag在计算上会消耗更多的服务器资源,而Last-Modified则无法精确处理资源的更新状态,因此两种方式都应该结合实际情况进行选择。