我使用ETag
标头进行缓存,浏览器会发送相应的If-None-Match
标头。最初,我只是简单地比较了这些标题并且它起作用了。
后来我发现rfc2616允许实体列表,所以我修复了它。问题是,如果修复程序被使用过......
If-None-Match
标头的请求?答案 0 :(得分:2)
我可以想到两个用例:浏览器和缓存代理实体标签的联合以及自定义客户端缓存实现。
虽然我从未见过浏览器在If-None-Match
中使用多个实体标签提供请求,但是有一些缓存代理可能拥有自己所请求资源的版本。在将请求进一步发送到服务器之前,它们可以用浏览器的资源版本实体标签和代理资源版本实体标签的联合替换浏览器发送的If-None-Match
的值。这样,如果代理具有所请求资源的最新版本,则可以通过从代理而不是服务器提供完整响应(使用正文有效负载)来减少服务器负载。这种情况由RFC 7234 Hypertext Transfer Protocol (HTTP/1.1): Caching描述:
当缓存决定重新验证其自己存储的响应时 请求包含实体标记的If-None-Match列表,缓存 可以将收到的列表与自己的实体标签列表组合在一起 存储的响应集(新鲜的或陈旧的)并发送的联合 两个列表作为替换的If-None-Match头字段值 转发请求。
我不能说是否支持RFC 7234的那部分是广泛的,但肯定有代理支持它。检查Colin Mollenhour的Node.js Caching Reverse HTTP Proxy项目。
另一方面,您可能不希望依赖浏览器来执行条件请求。您可以使用If-None-Match
自行设置XMLHttpRequest.setRequestHeader()
HTTP标头值。如果使用Web Storage API,Cache API或其他机制存储多个版本的资源,这将非常有用。服务器响应必须包含带有entity-tag的ETag
HTTP标头。此实体标记指示资源的哪个版本被认为是新鲜的。
答案 1 :(得分:0)
我最近一直在阅读很多有关缓存机制的内容,并发现自己也在问这个问题。我只能想到用例(除了Leonid提到的那些),在存储和发送多个ETags
时有意义:当一个资源回滚。
可能是意外,例如为json提供服务的api,并且基础数据会经常更新,以恢复到以前的版本。
但它也可能按设计,其中一个大的配置对象只有几个不同的版本可能会被切换很多。 (改变它的频率很重要,否则缓存不会带来很多价值)。在这种情况下,缓存很乐意随时准备好所有可用的版本。
我知道这是一个很长的镜头,我无法想到任何适合其中一个的真实情况。此外,重新验证无论如何,缓存命中是要走的路=)
另外,您可能想阅读this。似乎所有缓存只存储最后发送的ETag
(由于明显的内存原因,这是可理解的。)
希望这有帮助