哪些反向代理支持HTTP / 1.1 ETag和If-None-Match标头?


8

我正在为电子商务平台开发一个缓存系统,该系统将使用反向代理进行缓存。我计划通过使用正确的HTTP / 1.1标头来处理无效。也就是说,我将在第一代内容上设置一个ETag,并将该ETag值缓存在应用程序中。Cache-Control标头将指定“必须重新验证”,因此代理应在随后的带有ETag的请求上设置If-None-Match标头。应用程序将查找缓存的ETag值,如果匹配则将发送304响应,否则将生成完整的200响应。

我希望使用nginx,但我不能确定它是否支持ETags(文档表明它不支持ETags,但也许它们已经过时了?)。清漆是另一种选择,但我在这里也不满意。

哪些反向代理服务器完全支持ETag?我希望它实际上可以缓存多个版本,因此我可以执行拆分测试之类的事情而不必禁用缓存。也就是说,HTTP / 1.1指定客户端可以发送具有多个ETag值的If-None-Match,并且服务器应以匹配的ETag响应(如果有)。如果反向代理保留多个副本而不只是最后看到的值,并让服务器在每个要使用的请求上指定,那将是理想的。

Answers:


2

我只是签入Varnish源代码,即使它支持If-Modified-SinceIf-None-Match标头,也不支持must-revalidateCache-Control。唯一支持的属性在Cache-Controlmax-ages-max-age

参考文献:


谢谢。我对Varnish VCL不太了解,但是鉴于Varnish似乎支持重新验证,是否可以指定使用VCL始终重新验证?
ColinM 2012年

刚刚发现Varnish的“ experimental-ims”分支似乎增加了对If-None-Match的完全支持。希望它将最终合并到一个稳定的发行版中。varnish-cache.org/trac/wiki/BackendConditionalRequests
ColinM

2

nginx需要第三方模块来支持ETag。其中有两个


静态etags模块用于生成etag,而不是使用etag缓存内容。类似地,动态etags模块为动态内容生成etag,以供上游使用,而不是反向代理使用。不过,我认为与反向代理的ETag nginx的1.3增加官方支持..
ColinM

1
仅供以后参考,nginx从1.7.3开始支持ETag和If-None-Match,但是它仍然只能为给定的URL缓存一个结果,因此我不会称之为完全支持。也就是说,在重新验证期间,您不能与服务器缓存和协商多个响应。参见trac.nginx.org/nginx/ticket/101
ColinM,2016年

1

如果我错了,请纠正我,我知道这是一篇旧文章-但我想为新的路人发表评论。我相信反向代理缓存对使用ETag的帮助不尽如人意。

验证缓存机制使用源服务器来验证请求中的ETag(或上次修改日期)是否仍然有效(匹配或不匹配资源etag,具体取决于所使用的标头,或是否已修改)自要求中给出的日期起)。

这意味着反向代理缓存(例如Varnish)仍会将请求传递给原始服务器。它可能会响应请求,而不是由服务器处理,但是您没有保存到原始服务器的往返行程。

浏览器可以在任何情况下缓存响应并处理304响应,因此与使用反向代理(YMMV,尤其是大规模扩展,当然取决于您的使用情况)相比,用户的私有缓存可能更适合处理此问题。想要对您的应用进行假设)。

根据规范13.3

当缓存中有一个过时的条目要用作对客户端请求的响应时,它首先必须与原始服务器(或可能是具有新响应的中间缓存)进行检查,以查看其缓存条目是否仍然可用。我们称此为“验证”缓存条目。由于如果缓存的条目是好的,我们不需要支付重新传输完整响应的开销,并且如果缓存的条目无效,我们也不想支付额外的往返开销,因此HTTP / 1.1协议支持使用条件方法。

然后注意13.3.4

一个HTTP / 1.1缓存代理,在接收到一个包含上次修改日期和一个或多个实体标签作为缓存验证器的条件请求后,务必不要将本地缓存的响应返回给客户端,除非该缓存的响应与所有请求中的条件标头字段。

因此,Varnish可以为您返回响应,但是您仍然可以往返于服务器。如果您可以使用APC或内存缓存之类的应用程序缓存,那么对您来说还是值得的。但是,验证缓存通常比节省服务器资源更好地节省带宽。

验证缓存最好留给客户端(浏览器或api代码)。

使用Expiration模型进行缓存是真正实现反向代理缓存的地方。这样,您就可以完全跳过原始服务器。使用ExpiresCache-ControlDate等,是最好的(再次,IMO)的反向代理缓存作为缓存可以返回的响应机制,假设它不是陈旧的,不会去访问原始服务器。


对于这个问题,我想到的用例是让代理与原始服务器重新验证,并且如果ETag与将为给定记录缓存的ETag匹配,则原始服务器返回304。也就是说,当首次呈现页面并使用该记录的主键保存页面时,将随机生成ETag。如果记录被修改,ETag将被删除。
ColinM 2014年


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.