【问题标题】:What's the best way to create an etag? [closed]创建 etag 的最佳方法是什么? [关闭]
【发布时间】:2008-10-02 12:54:27
【问题描述】:

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

【问题讨论】:

标签: caching etag


【解决方案1】:

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

【讨论】:

  • 是不是很慢?您需要读取文件的内容,该文件可能长达数 MB。添加对它的并发访问,您就有了一个爬网网站。
  • 是的,大文件会导致问题,如果$content 已经可用/已读取。在这种情况下,应该使用文件元数据(大小和时间戳)。
【解决方案2】:

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

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

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

ETag 对 RESTful API 也很有意义。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        木法沙,

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

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

        【讨论】:

        • 呃,我就是这么说的。
        • 呃,你说雅虎不鼓励他们使用,我指出他们鼓励他们的使用。
        • 好吧,如果您阅读了雅虎关于该主题的完整帮助,是的。但 YSlow 本身让他们看起来不鼓励它。这句话的语义是有争议的,但我的答案的观点仍然有效。
        【解决方案6】:

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

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

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

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

        【讨论】:

        • 浏览器确实使用它们,否则它们将毫无意义。例如,请参阅 RFC 2068:freesoft.org/CIE/RFC/2068/187.htm>。正如您所说,实体标签只需足够详细,以便能够告诉浏览器实体本身已被修改。
        猜你喜欢
        • 2014-01-22
        • 2018-06-07
        • 2012-01-28
        • 2021-08-30
        • 2012-01-19
        • 1970-01-01
        • 2010-09-06
        • 2017-08-06
        • 1970-01-01
        相关资源
        最近更新 更多