我目前正在研究在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
答案 0 :(得分:2)
在Apache中,ETag由文件的inode,大小和上次修改时间构成:http://httpd.apache.org/docs/2.2/mod/core.html#FileETag
有不同的选项,您可以将它们配置为可配置。我会给你一个可能的选项列表,从最不可靠到最可靠:
对于ETag本身的哈希值,我建议使用加密哈希函数,即使对数字签名不再强大的哈希函数也是如此。我不推荐没有明确设计为加密强大的散列函数,因为它们不会产生如此小的摘要,因为加密散列具有相当级别的冲突阻力。通过碰撞我的意思是两个不同的文件产生相同的哈希。 MD5仍然非常适合文件内容更改监控 - 因为它的高速和小的摘要大小。它是最快的哈希函数。您还可以在汇编中找到快速MD5实现,例如从OpenSSL或https://www.nayuki.io/page/fast-md5-hash-implementation-in-x86-assembly或http://blog.bfitz.us/?p=827