如何实施弱etags?

时间:2014-08-22 09:13:29

标签: http etag

我知道强etag可以是HTTP资源的散列,并且相同的散列意味着资源是字节到字节的等价物。相反,弱etag意味着内容在语义上是等价的。

现在我不明白的是实施。

强大的etag似乎很容易,你只需要对资源进行哈希处理,如果匹配则你知道内容是相同的;但是你如何计算内容呢?

首先想到的是从计算中排除可能发生变化的一切(与内容无关)。


我们举一个简单的例子:

具有已重新压缩的.jpg图像的网页。内容在语义上是相同的,但资源的哈希值会发生变化。

然后我理解在这种情况下我应该使用弱etag,但为了计算它我只需要散列页面的内容并从散列中排除图像。

但是,如果图像的内容实际发生变化,则不会反映在etag中。

它是如何运作的?

1 个答案:

答案 0 :(得分:0)

我不知道你如何为你的页面实现ETag,但这就是我理解ETag的用法:

假设我们只使用强大的ETag:

如果您为自己的网页提供ETag,例如HTML,您将根据页面的标记创建一个哈希。如果您的网页包含图片,则表示为网址。因此,如果您重新压缩图像,只要URL保持不变,它就不会影响页面的Etag。

加载页面时,浏览器会额外请求加载页面上的图像。对图像的请求应具有单独的ETag实现。只要图像的字节内容发生变化,图像的ETag就会发生变化(实现也可能使用修改日期)。

现在为弱ETag:

如果底层模型没有更改,Web资源将返回相同的ETag,无论使用何种表示形式。例如,您有一个端点,以HTML4,HTML5,计划XML和JSON显示产品信息 - 如果产品的模型没有变化,则应返回相同的弱ETag。这些表示中的每一个都需要具有不同的强Etags。

对于弱图像的Etag我可以想象以下实现(尽管听起来非常不切实际): Etag是基于未压缩的位图创建的,无论压缩参数(压缩比)和格式(JPEG,PNG等)如何,都会提供相同的Etag。每当图像的内容发生变化(在位图级别上)etag发生变化,但重新压缩不会影响它(它会影响强大的ETag)。