带有Apache 2.4的RFC 2616

我使用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未命中。