25

以编程方式为网页生成 etag 的好方法是什么,是否推荐这种做法?一些网站建议关闭 etag,其他网站建议手动生成它们,还有一些建议保持默认设置处于活动状态 - 这里最好的方法是什么?

4

6 回答 6

5

我建议生成内容的哈希,例如md5($content).
此外,为了防止散列冲突,您可能希望向其中添加内容元素的 ID(如果合适的话)。

于 2008-10-02T15:44:49.580 回答
3

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

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

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

ETags 对 RESTful API 也很有意义。

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

于 2008-10-02T14:17:04.237 回答
3

我刚刚启动了 YSlow,它抱怨 Etags,所以我做了一些研究。根据雅虎博客(也请参阅评论),问题是默认的 ETags 实现使用文件 inode 编号或 ntfs 修订号或其他同样特定于服务器的东西作为哈希的一部分。这虽然速度很快,但基本上可以防止 2 个不同的服务器提供相同的文件具有相同的 etag,并搞砸浏览器和下游缓存或负载平衡。

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

对我自己而言,由于我处于一个文件时间戳绰绰有余的简单环境中,所以我只是在 Apache 中使用FileETag none我的 .htaccess 文件将它们关闭。这会关闭 YSlow 并且应该使事情回退到文件上的最后修改日期。

于 2009-05-05T21:12:09.460 回答
1

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

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

于 2008-10-02T16:16:58.100 回答
1

木法沙,

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

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

于 2008-10-06T07:37:05.893 回答
-5

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

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

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

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

于 2008-10-02T16:26:53.473 回答