浏览器协商缓存中的ETag是怎么生成的?

上一篇浏览器的缓存机制 讲了整个的缓存流程,那么其中的ETag是怎么生成的呢?

其实在不同的Web服务器有不同的算法,今天,我们就以nginx为例,看一下是怎么生成的。

以这个资源文件的请求为例
image

可以看到Server是 nginx/1.14.0,那我们再去看看nginx的源码是怎么生成ETag的ngx_http_core_modules.c

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;

通过源码可以得知,ETag是由Last-Modified和Content-Length的16进制计算得到,那么我们反过来计算一下,是不是能将5e99b190转化成Last-Modified的 Fri, 17 Apr 2020 13:39:28 GMT?

image

哈哈,果真是一样的!!!

其他Web服务生成ETag的示例demo如下,至于算法要自行研究啦
image