Http 弱ETag是如何实现的?

Http 弱ETag是如何实现的?,http,etag,Http,Etag,我知道强etag可以是HTTP资源的散列,相同的散列表示该资源是字节到字节等效的。弱etag表示内容在语义上是等价的 现在我不明白的是它的实现 对于一个强大的etag来说似乎很容易,您只需对资源进行哈希,如果它匹配,那么您就知道内容是相同的;但是如何计算内容呢 想到的第一个想法是从计算中排除所有可能发生变化的内容(与内容无关) 让我们举一个简单的例子: 具有已重新压缩的.jpg图像的网页。内容在语义上是相同的,但资源的散列将发生变化 然后我明白在这种情况下我应该使用弱etag,但要计算它,我只

我知道强etag可以是HTTP资源的散列,相同的散列表示该资源是字节到字节等效的。弱etag表示内容在语义上是等价的

现在我不明白的是它的实现

对于一个强大的etag来说似乎很容易,您只需对资源进行哈希,如果它匹配,那么您就知道内容是相同的;但是如何计算内容呢

想到的第一个想法是从计算中排除所有可能发生变化的内容(与内容无关)


让我们举一个简单的例子:

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

然后我明白在这种情况下我应该使用弱etag,但要计算它,我只需要对页面内容进行散列,并从散列中排除图像

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


它是如何工作的?

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

假设我们只使用强ETag: 如果您为您的网页(例如HTML)提供ETag,您将根据网页的标记创建哈希。如果您的页面包含图像,则将其表示为URL。因此,如果重新压缩图像,只要URL保持不变,就不会影响页面的Etag

加载页面时,浏览器将发出额外请求,以加载页面上的图像。对图像的请求应该有一个单独的ETag实现。每当映像的字节内容发生变化时,映像的ETag就应该发生变化(实现也可以使用修改日期)

现在,对于弱势ETag: 如果基础模型没有更改,则web资源将返回相同的ETag,而不管使用何种表示。例如,您有一个以HTML4、HTML5、plan XML和JSON显示产品信息的端点—如果产品的模型没有更改,则应返回相同的弱ETag。每个表示都需要有不同的强ETag

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

听起来不错。如何为弱etag创建哈希?我的意思是创建散列的原始文档是什么?或者它实际上需要是一个散列吗?这可能与规范有关,但我找不到/无法理解。弱etag将基于用于生成页面的某些元模型。这个元模型可以是页面的所有动态部分。如果内容发生变化,Etag将发生变化,但如果您(例如)更改布局并呈现相同的内容,Etag将保持不变。但是,据我所知,在网页上使用弱ETag并没有什么好处。我在HTTP Web API中看到了更多,它以不同的表示形式提供内容。好的,感谢您的澄清。实际上,我现在将其用于API。我需要弱ETag,所以Nginx让它们在Gzip激活的情况下通过。它不适用于强ETag,因为压缩版本不是逐位相同的。