Apache 在web服务器中实现httpetag

Apache 在web服务器中实现httpetag,apache,http,caching,etag,Apache,Http,Caching,Etag,我目前正在研究在Web服务器中实现ETag的可能性,以便只支持条件GET。Web服务器是用C++编写的,只在Windows操作系统上运行。在做了一些研究之后,我有几个问题…实现此功能的服务器是否通常会缓存特定文件的ETag GUID?我对Apache代码库不太熟悉,但我能够找到ap_condition_if_none_match函数,但我不完全清楚他们如何检查if none match头的GUID值。如果他们进行缓存操作,并且文件在服务器之外进行任何更改(即,用户对其进行了更新),服务器如何知道

我目前正在研究在Web服务器中实现ETag的可能性,以便只支持条件GET。Web服务器是用C++编写的,只在Windows操作系统上运行。在做了一些研究之后,我有几个问题…实现此功能的服务器是否通常会缓存特定文件的ETag GUID?我对Apache代码库不太熟悉,但我能够找到ap_condition_if_none_match函数,但我不完全清楚他们如何检查if none match头的GUID值。如果他们进行缓存操作,并且文件在服务器之外进行任何更改(即,用户对其进行了更新),服务器如何知道其缓存中的文件不再有效?他们是否可能使用一些API来“监视”目录更改


编辑:我正在查看我在这里找到的一些信息:

在Apache中,ETag由文件的inode、大小和上次修改时间组成:

有不同的选项,您可以使其可配置。我将为您提供一份可能的选项列表,从最低到最可靠:

  • [最快选项]以高于1秒的频率检查上次文件修改时间。例如,在Windows中,文件时间以100纳秒的间隔测量。还要像Apache一样检查文件大小和inode。在Windows下,您可以通过GetFileInformationByHandle查询打开句柄的文件ID,而不是inode。参见nFileIndexHigh,nFileIndexLow;这是文件ID的高和低部分,分别为64位。如果文件时间、大小和索引节点已更改,请重新计算哈希
  • [更安全的选项]除了文件时间、大小和索引节点外,还可以使用Intel(SSE4.2)实现的非常快速的CRC32功能检查文件内容–它比SSE4.2之前存在的任何CRC32实现都快得多。如果文件时间或CRC32已更改,请重新计算哈希
  • [快速安全选项,但使用句柄]仅在服务器运行时计算哈希值。当您的服务器首次启动时,应该不会计算哈希值。如果第一次请求文件,则计算哈希并存储它,直到服务器退出。在服务器运行时,使用操作系统的文件更改通知监视文件更改(对您有哈希的文件)。例如,在Widnows中,有FindFirstChangeNotification
  • 对于ETag本身的散列值,我会建议使用加密散列函数,即使对于数字签名来说不再强大。我不推荐一个没有明确设计成密码强大的散列函数,因为它们不会产生像加密散列那样的小摘要,从而具有相当的抗冲突能力。冲突是指两个不同的文件产生相同的散列。MD5仍然非常适合于文件内容更改监视—考虑到它的高速度和小摘要大小。它是最快的128位散列函数,可以从最初为加密设计的散列函数中获得。您还可以在汇编中找到一个快速的MD5实现,例如从OpenSSL或从或-在使用Skylake微体系结构的处理器上,最后一个实现的性能是每字节4.94个CPU周期