在Web服务器中实现HTTP ETag

时间:2016-04-08 03:12:15

标签: apache http caching etag

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

编辑:我正在审核我在此处找到的一些信息:https://httpd.apache.org/docs/2.4/caching.html

1 个答案:

答案 0 :(得分:2)

在Apache中,ETag由文件的inode,大小和上次修改时间构成:http://httpd.apache.org/docs/2.2/mod/core.html#FileETag

有不同的选项,您可以将它们配置为可配置。我会给你一个可能的选项列表,从最不可靠到最可靠:

  1. [最快的选项]以高于1秒的频率检查上次文件修改时间。例如,在Windows中,文件时间以100纳秒的间隔进行测量。还要检查Apache的文件大小和inode。在Windows下,您可以通过GetFileInformationByHandle查询打开句柄的文件ID,而不是inode。参见nFileIndexHigh,nFileIndexLow;这是文件ID的高低部分,即64位。如果文件时间,大小和inode已更改,请重新计算哈希值。
  2. [SAFER OPTION]除文件时间,大小和inode外,还使用Intel(SSE4.2)实现的非常快的CRC32功能检查文件内容 - 它比SSE4.2之前存在的任何CRC32实现快得多。如果文件时间或CRC32已更改,请重新计算哈希值。
  3. [快速安全选项但消耗处理]仅在服务器运行时计算哈希值。当您的服务器首次启动时,应该不计算哈希值。如果首次请求文件,请计算哈希值并将其存储直到服务器退出。在服务器运行时,使用操作系统的文件更改通知监视文件更改(您有哈希的文件)。例如,在Widnows中,有FindFirstChangeNotification。
  4. 对于ETag本身的哈希值,我建议使用加密哈希函数,即使对数字签名不再强大的哈希函数也是如此。我不推荐没有明确设计为加密强大的散列函数,因为它们不会产生如此小的摘要,因为加密散列具有相当级别的冲突阻力。通过碰撞我的意思是两个不同的文件产生相同的哈希。 MD5仍然非常适合文件内容更改监控 - 因为它的高速和小的摘要大小。它是最快的哈希函数。您还可以在汇编中找到快速MD5实现,例如从OpenSSL或https://www.nayuki.io/page/fast-md5-hash-implementation-in-x86-assemblyhttp://blog.bfitz.us/?p=827