为什么Nginx etag值由上次修改时间和内容长度生成?

时间:2019-04-26 03:18:14

标签: nginx etag http-caching

Nginx etag source

this.zuulProperties.getRoutes().remove(oldExternalapis.getServiceId());

this.zuulProperties.getRoutes().put(newExternalapis.getServiceId(), zuulRoute);

如果服务器中的文件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; r->headers_out.etag = etag; 已更改,但文件内容尚未更新,那么last-modified-time的值是否相同?

为什么内容哈希生成的etag值不是?

1 个答案:

答案 0 :(得分:1)

  

为什么内容哈希不能生成etag值?

除非nginx记录了无法说出为什么的原因。

我的推测 他们之所以这样做是因为它非常快并且只需要固定的时间。计算散列可能是一项昂贵的操作,所需的时间取决于响应的大小。以简单性和速度而闻名的nginx可能并不想增加这种开销。

  

如果服务器中的文件上次修改时间已更改,但文件内容尚未更新,则etag值是否相同?

否,它不会相同,因此必须重新保存文件。结果是,响应速度比基于散列的ETag慢,但是响应是正确的。

此算法的最大问题是,ETag保持不变时内容可能会更改,在这种情况下,响应将不正确。如果文件更改(以保持相同长度的方式)快于Last-Modified标头的精度,则可能会发生这种情况。 (当然,不同的内容也可能产生相同的哈希,因此这种方法也不是完全不受问题困扰的。)

因此,大概是nginx权衡了这种权衡-一种更快的响应,但是有一点不正确的机会-并认为这是值得的。