你知道 http 响应头中的 ETag 是如何生成的吗
2019-12-10 23:18
3447 查看
关于
etag的生成需要满足几个条件
- 当文件不会更改时,
etag
值保持不变。所以不能单纯使用inode
- 便于计算,不会特别耗 CPU。这样子
hash
不是特别合适 - 便于横向扩展,多个
node
上生成的etag
值一致。这样子inode
就排除了
关于服务器中
etag如何生成可以参考 HTTP: Generating ETag Header
那么在 nginx
中的 etag
是如何生成的?
nginx 中 ETag 的生成
我在网上找到一些资料与源代码了解到了
etag的计算方法。由
python伪代码表示计算方法如下
etag = '{:x}-{:x}'.format(header.last_modified, header.content_lenth)
etag->value.len = ngx_sprintf(etag->value.data, "\"%xT-%xO\"", r->headers_out.last_modified_time, r->headers_out.content_length_n) - etag->value.data;
总结:nginx
中 etag
由响应头的 Last-Modified
与 Content-Length
表示为十六进制组合而成。
随手在我的k8s集群里找个
nginx服务测试一下
$ curl --head 10.97.109.49 HTTP/1.1 200 OK Server: nginx/1.16.0 Date: Tue, 10 Dec 2019 06:45:24 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 23 Apr 2019 10:18:21 GMT Connection: keep-alive ETag: "5cbee66d-264" Accept-Ranges: bytes
由
etag计算
Last-Modified与
Content-Length,使用
js计算如下,结果相符
> new Date(parseInt('5cbee66d', 16) * 1000).toJSON() "2019-04-23T10:18:21.000Z" > parseInt('264', 16) 612
Last-Modified,ETag 与协商缓存
我们知道协商缓存有两种方式
Last-Modified
/if-Modified-Since
ETag
/If-None-Match
既然在
nginx中
ETag由
Last-Modified和
Content-Length组成,那它便算是一个加强版的
Last-Modified了,那加强在什么地方呢?
**
Last-Modified是由一个
unix timestamp表示,则意味着它只能作用于秒级的改变**
相关文章推荐
- 如何使用 HTTP 响应头字段来提高 Web 安全性?
- 如何知道java手机的J2ME Connection interface 支持HTTP, Socket, UDP, Serial port中的哪些?
- HTTP请求响应头信息|用Servlet如何实现验证码
- http响应Last-Modified和ETag(转)
- 你应该知道的HTTP头------ETag
- 如何在 ASP.NET 中(服务器端)主动清除(HTTP内容响应时)浏览器中的 Cookies 数据
- 如何使用 HTTP 响应头字段来提高 Web 安全性?
- http响应Last-Modified和ETag
- 理解HTTP响应的ETag
- HTTP响应头之ETag
- 现在有动态生成table若干行,每行里会有一个button.当鼠标点击其中一个button时.如何让程序知道是点在第几行的button上
- 高性能 Web 集群系列文章(一)——如何生成每秒百万级别的 HTTP 请求?
- 前端、服务器端和数据库端结构关系?HTTP请求中如何判断浏览器类型?HTTP响应的状态码信息
- 如何生成每秒百万级别的 HTTP 请求?
- Asp.net 2.0 中.aspx请求,即如何生成响应的Html文件
- http响应Last-Modified和ETag
- 服务器响应的生成:HTTP响应报头——HttpServletResponse接口的应用
- http响应Last-Modified和ETag以及asp.net web api实现
- http响应Last-Modified和ETag以及asp.net web api实现(转载)
- http响应Last-Modified和ETag以及asp.net web api实现