编程技术文章分享与教程

网站首页 > 技术文章 正文

HTTP响应头之Etag https响应报文为空

hmc789 2024-11-13 11:32:34 技术文章 2 ℃

什么是 ETag

ETag全称Entity Tag,用来标识一个资源。通常情况下,ETag更类似于指纹,如果资源发生变化了就会生成一个新的指纹,这样可以应用于客户端的缓存:服务器产生ETag,并在HTTP响应头中将其传送到客户端,服务器用它来判断页面是否被修改过,如果未修改返回304,无需传输整个对象。

如上图所示,第一次请求,服务器在返回响应时,在Http头中包含一个值为"x1323ddx"的ETag(注:HTTP中并没有指定如何生成ETag,哈希是比较理想的选择),状态码为200。

如上图所示,第二次请求,这个时候客户端请求同时发送一个If-None-Match头,这个头的内容就是我们第一次请求时服务器返回的ETag,服务器收到请求后如果资源没有发生改变,服务器的ETag是同一值,服务器就不返回200,而是返回304的响应,告诉客户端缓存有效。(由于不返回数据体,所以在资源不变的情况下后续的请求对流量消耗比较小。)

ETag语法

ETag: W/"<etag_value>"
ETag: "<etag_value>"
  • W/ 可选'W/'(大小写敏感) 表示使用弱验证器。 弱验证器很容易生成,但不利于比较。 强验证器是比较的理想选择,但很难有效地生成。 相同资源的两个弱Etag值可能语义等同,但不是每个字节都相同。
  • "<etag_value>"实体标签唯一地表示所请求的资源。 它们是位于双引号之间的ASCII字符串(如“675af34563dc-tr34”)。 没有明确指定生成ETag值的方法。 通常,使用内容的散列(哈希值的方式会带来一些服务器资源的消耗),最后修改时间戳的哈希值,或简单地使用版本号。

ETag 的作用

1、一些文件也许会周期性更改,但是他的内容并不改变(仅仅改变的修改时间),我们并不希望客户端认为这个文件被修改了,而重新GET;

2、某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断;

3、某些服务器不能精确得到文件的最后修改时间;

4、通过设置不同的响应头Cache-Control来控制浏览器和Web代理对缓存的使用策略,通过设置请求头If-None-Match和响应头ETag,来对缓存的有效性进行验证。

标签列表
最新留言