创建etag的最佳方法是什么?

时间:2008-10-02 12:54:28

标签: caching etag

以编程方式为网页生成etag的好方法是什么?推荐这种做法吗?有些网站建议关闭etags,其他网站建议手动制作,有些网站建议保留默认设置 - 这里最好的方法是什么?

6 个答案:

答案 0 :(得分:4)

我建议生成内容的哈希,例如md5($content)
此外,为了防止哈希冲突,您可能希望添加例如它的内容元素的ID(如果这是合适的)。

答案 1 :(得分:3)

当你严重依赖缓存时,ETag很有意义。它们是资源状态(例如URL)的重要指标。

例如,假设您使用 ajax 请求来提取用户的最新评论,并且您想知道是否有任何新评论。将ETag更改为警告您的新内容应用程序是一种较便宜的检查方式。

因为如果ETag相同,您可以保留缓存,但重建它。

ETags在RESTful API中也很有意义。

至于生成它,看spec,我想你几乎可以做任何你想做的事情。时间戳,哈希,对您/您的应用程序有意义的任何内容。

答案 2 :(得分:3)

我刚刚解雇了YSlow而且它抱怨了Etags,所以我做了一些研究。根据{{​​3}}(请参阅注释)的问题是,默认的ETags实现使用文件inode编号或ntfs版本号或其他同样服务器特定的作为哈希的一部分。这虽然速度很快,但基本上可以防止2个不同服务器提供的同一个文件具有相同的标签,并且会破坏浏览器和下游缓存或负载平衡。

之前使用MD5 Hash的建议是一个很好的建议,尽管你必须防止它本身成为性能问题。这些建议的实现仍然取决于读者,尽管在我看来,这似乎是你的框架可以为你处理的事情。

对于我自己来说,由于我处于文件时间戳绰绰有余的简单环境中,我只是在我的.htaccess文件中使用FileETag none在Apache中关闭它们。这会关闭YSlow并使事情回落到文件的最后修改日期。

答案 3 :(得分:1)

通常,阻止其使用的“网站”是Yahoo,这是因为某些默认Web服务器不会自动创建在服务器场中工作的ETAG。 (雅虎声称这是正确和准确的。)

但是,如果你有一个网络服务器,那么你就没事了。如果没有,您将需要检查Web服务器如何处理此问题并采取适当的行动。

答案 4 :(得分:1)

穆法沙,

Yahoo(和YSlow)实际上鼓励他们使用,但需要注意的是,自动生成的ETag因服务器而异。

我还不能投票,所以我只是说我同意文件路径和时间戳的哈希建议(或表名+主字段值+时间戳,如果由db内容表示)。

答案 5 :(得分:-4)

当您在网站生成器前使用某种缓存机制时,ETags会提供帮助。浏览器本身不使用它们,它们会听取“(如果)修改自”或“年龄”标题结构,afaik。

无论如何,由于其简单的特性,提供带有ETag的http-header是没有问题的。我听说许多Web服务器只是获取文件的位置和文件的时间戳,并对这些数据进行md5-hash。

作为一个例子,我们用我们的软件构建了一个简单但有效的etag。我们软件中的每个“内容单元”(即html,jpegs,gif ......)都有唯一的id和版本号(即jpeg的id为“17”,版本为“2”,这意味着它被更改了一次) 。所以ETag只是字符串“id-version”,这里是:“17-2”。随着下一次更改,它将是“17-3”,以便cacher识别更改,完全加载新内容部分(一次)并将其存储在自己的缓存中。

但你也可以使用URL和时间戳(即文件的时间戳)。