我使用Apache 2.4.3作为反向代理,因为它的广告符合RFC 2616.我的应用程序使用这样的头来启用代理上的caching:
Cache-Control: public, s-maxage=0 Expires: ... (+1 day) X-Group: A Vary: X-Group ETag: W/"foo1"
在第一个请求加热caching之后,如果我的应用程序更改为响应此:
Cache-Control: public, s-maxage=0 Expires: ... (+1 day) X-Group: B Vary: X-Group ETag: W/"foo2"
如果来自Apache的If-None-Match标头匹配源产生的ETag,应用程序将以304 Not Modified进行响应。 然而,Apache然后caching第二个200响应,并用新的响应replace “foo1”logging,而不是用不同的ETagcaching两个响应。 因此,取代If-None-Match: W/"foo1", W/"foo2" ,下一个重新生效请求就是If-None-Match: W/"foo2" 。 所以caching不断地错过,而不是总是得到命中。
从RFC 2616第12.1节:
但是,源服务器并不局限于这些维度,而是可以根据请求的任何方面来改变响应,包括请求头字段之外或本规范未定义的扩展头字段之内的信息。
我已经尝试了Vary的以下组合:
Vary: X-Foo Vary: * Vary: User-Agent
我也尝试了强和弱的ETags,无论我不能让Apache同时caching两个响应,它总是比以前节省更多。 如果它不能保存一页以上的方差,那么ETag是无用的,Last-Modified将是一样的好。
从Apache 2.4文档:
mod_cache实现符合RFC 2616的HTTP内容cachingfilter,支持caching包含Vary头的内容协商响应。
请注意,它表示“响应”复数。 我误解了HTTP规范还是Apache 2.4不完全支持ETags?
你给了几个这样的例子:
Cache-Control: public, s-maxage=0 Expires: ... (+1 day) X-Group: A Vary: X-Group ETag: W/"foo1"
我特别注意到Vary: X-Group标题。 X-Group是一个请求头还是一个响应头?
根据RFC 2616第14.44节的规定 , Vary应该列出任何请求头,这将导致源服务器的不同内容表示。 从你的例子中,我怀疑X-Group可能是一个响应头,在这种情况下,mod_cache将不会存储给定资源的多个版本。
你可以尝试的一件事是设置Vary: If-None-Match ,这会让mod_cache为每个ETag存储一个版本的资源。 无可否认,我还没有尝试过。 假设它起作用,其中一个缺点是来自任何客户端的第一个请求将是caching未命中。