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

时间:2020-03-06 15:01:27  来源:igfitidea点击:

以编程方式为网页生成etag的一种好方法是什么,建议这种做法吗?一些网站建议关闭etags,另一些网站建议手动生成etags,另一些网站建议保持默认设置为活动状态,最好的方法是什么?

解决方案

当我们高度依赖缓存时,ETag很有意义。它们是资源状态(例如URL)的重要指示器。

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

因为如果ETag相同,则可以保留缓存,但是可以重新构建它。

使用RESTful API,ETag也很有意义。

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

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

当我们在网站生成器前面使用某种缓存机制时,ETag会提供帮助。浏览器本身不使用它们,而是听"(if)修改自"或者" age"标头结构afaik。

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

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

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

Mufasa,

Yahoo(和YSlow)实际上鼓励使用它们,但要注意的是,服务器之间自动生成的ETag会有所不同。

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

我只是解雇了YSlow,它抱怨Etags,所以我做了一些研究。根据Yahoo博客(也请参阅注释),问题在于默认的ETags实现使用文件inode编号或者ntfs修订版编号或者其他特定于服务器的内容作为哈希的一部分。尽管速度很快,但基本上可以防止2个不同服务器提供的相同文件具有相同的etag,并破坏浏览器和下游缓存或者负载平衡。

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

就我自己而言,由于我处于一个简单的环境中,文件时间戳将绰绰有余,因此我只是在.htaccess文件中使用" FileETag none"在Apache中将其关闭。这将关闭YSlow,并使情况回落到文件上的最后修改日期。