HTTP协议中的ETag和Last-Modified是两个常用的头部字段,它们都是用于协商缓存的。在客户端和服务器之间传输资源时,对于一些静态资源,其内容很可能会长时间不变,因此可以通过协商缓存来减少网络传输量,提高网站性能。
ETag头部
ETag头部可以理解为一个实体标识符,是由服务器为每个响应资源生成的一个唯一的字符串。客户端在请求资源时,可以携带上一次请求返回的ETag值,服务器收到请求后会计算当前资源的ETag值,如果两个值一致则返回304 Not Modified,表示客户端可以继续使用缓存中的资源,否则返回200 OK,表示需要重新传输资源。
下面是一个示例:
客户端发起请求:
GET /static/image.png HTTP/1.1
Host: example.com
If-None-Match: "2f28-571d1582e1f19"
标识上一次请求的ETag值为"2f28-571d1582e1f19"。服务器收到请求后会计算当前资源的ETag值,如果与上一次请求的值一致,则返回:
HTTP/1.1 304 Not Modified
ETag: "2f28-571d1582e1f19"
表示可以使用缓存中的资源。
而如果当前资源的ETag值不同,则返回:
HTTP/1.1 200 OK
ETag: "3f3a-58cd733ee383f"
Content-Type: image/png
Content-Length: 16115
表示需要重新传输资源。
Last-Modified头部
Last-Modified头部记录了响应资源的最后修改时间,也是用于协商缓存的。客户端在请求资源时,可以携带上一次请求返回的Last-Modified值,服务器收到请求后会判断当前资源的修改时间是否比上一次请求返回的值更晚,如果是则返回200 OK,否则返回304 Not Modified。
下面是一个示例:
客户端发起请求:
GET /static/file.css HTTP/1.1
Host: example.com
If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT
标识上一次请求的资源最后修改时间为"Wed, 21 Oct 2015 07:28:00 GMT"。服务器收到请求后会判断当前资源的修改时间是否比上一次请求返回的值更晚,如果是则返回:
HTTP/1.1 200 OK
Last-Modified: Wed, 23 Oct 2019 11:51:00 GMT
表示需要重新传输资源。
而如果当前资源的修改时间比上一次请求返回的值更早或相同,则返回:
HTTP/1.1 304 Not Modified
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
表示可以使用缓存中的资源。
总体而言,ETag头部和Last-Modified头部都是基于资源的标识符或修改时间进行缓存协商,可以有效地减少网络传输量和提升网站性能。在实际应用中,根据具体的情况和需求,可以选择使用其中之一或同时使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:HTTP的ETag和Last-Modified头部有什么作用? - Python技术站