【发布时间】:2008-10-02 12:54:27
【问题描述】:
以编程方式为网页生成 etag 的好方法是什么,是否推荐这种做法?一些网站建议关闭 etag,其他网站建议手动生成它们,还有一些建议保持默认设置处于活动状态 - 这里最好的方法是什么?
【问题讨论】:
-
您的技术环境是什么?一些网络服务器对此有丰富的内置支持。
以编程方式为网页生成 etag 的好方法是什么,是否推荐这种做法?一些网站建议关闭 etag,其他网站建议手动生成它们,还有一些建议保持默认设置处于活动状态 - 这里最好的方法是什么?
【问题讨论】:
我建议生成内容的哈希值,例如md5($content).
此外,为了防止哈希冲突,您可能需要添加例如内容元素的 ID(如果合适的话)。
【讨论】:
$content 已经可用/已读取。在这种情况下,应该使用文件元数据(大小和时间戳)。
当您严重依赖缓存时,ETag 很有意义。它们是资源状态(例如 URL)的重要指标。
例如,假设您使用 ajax 请求来拉取用户的最新 cmets,并且您想知道是否有任何新 cmets。将 ETag 更改为 alert 您的新内容应用程序是一种更便宜的检查方式。
因为如果 ETag 相同,您可以保留缓存,否则重建它。
ETag 对 RESTful API 也很有意义。
至于生成它,看看spec,我想你几乎可以做任何你想做的事情。时间戳,哈希,任何对您/您的应用程序有意义的东西。
【讨论】:
我刚刚启动了 YSlow,它抱怨 Etags,所以我做了一些研究。根据Yahoo blog(也请参阅 cmets),问题在于默认的 ETags 实现使用文件 inode 编号或 ntfs 修订号或其他同样特定于服务器的东西作为哈希的一部分。这虽然速度很快,但基本上可以防止 2 个不同的服务器提供相同的文件具有相同的 etag,并破坏浏览器和下游缓存或负载平衡。
之前使用 MD5 哈希的建议是一个很好的建议,尽管您必须防止它本身成为性能问题。这些建议的实施仍然取决于读者,尽管在我看来这是你的框架可能能够为你处理的事情。
对于我自己来说,由于我处于一个文件时间戳绰绰有余的简单环境中,因此我只是在 Apache 中使用 .htaccess 文件中的FileETag none 关闭了它们。这会关闭 YSlow 并让事情回退到文件的最后修改日期。
【讨论】:
通常,不鼓励使用的“站点”是 Yahoo,这是因为某些默认 Web 服务器不会自动创建在服务器场中工作的 ETAG。 (雅虎声称这是正确和准确的。)
但是,如果您只有一个 Web 服务器,那就没问题了。如果没有,您需要检查您的网络服务器如何处理此问题并采取适当的行动。
【讨论】:
木法沙,
Yahoo(和 YSlow)实际上鼓励使用它们,但需要注意的是,自动生成的 ETag 会因服务器而异。
我还不能投票,所以我只能说我同意文件路径和时间戳(或表名 + 主字段值 + 时间戳,如果由 db 内容表示)的哈希的建议。
【讨论】:
当您在网站生成器前使用某种缓存机制时,ETag 确实会有所帮助。浏览器本身不使用它们,它们听“(如果)修改后”或“年龄”标题结构,afaik。
无论如何,由于其简单的性质,提供带有 ETag 的 http-header 是没有问题的。我听说许多网络服务器只是简单地获取文件的位置和文件的时间戳,然后对这些数据进行 md5-hash。
例如,我们使用我们的软件构建了一个简单但有效的 etag。我们软件中的每个“内容单元”(即 html、jpeg、gif ......)都有唯一的 id 和版本号(即 jpeg 的 id 为“17”和版本“2”,这意味着它被更改过一次) .所以 ETag 就是字符串“id-version”,这里是:“17-2”。下一次更改将是“17-3”,以便缓存器识别更改,完全加载新内容部分(一次)并将其存储在自己的缓存中。
但您也可以使用 URL 和时间戳(即文件的时间戳)。
【讨论】: