我应该使用什么HTTP客户端头来指示代理从源站重新蚀刻并缓存响应?

我应该使用什么HTTP客户端头来指示代理从源站重新蚀刻并缓存响应?,http,caching,http-headers,cache-control,Http,Caching,Http Headers,Cache Control,我目前正在开发一个系统,其中客户端向源服务器发出HTTP 1.1请求。我同时控制客户端和服务器软件,因此可以自由支配HTTP头集。在客户端之间是多个分层的web代理/缓存设备(think、Squid或类似设备) 源服务器提供的数据通常是高度可缓存的,我打算设置HTTP响应头来表明这一点。具体来说,我计划使用缓存控制:public,max age=。我理解这将意味着中间代理将缓存响应,直到指定的最大年龄,在这一点上,它们将根据源重新验证(可能使用上次修改的头,查找304响应) 我遇到的问题是,客户

我目前正在开发一个系统,其中客户端向源服务器发出HTTP 1.1请求。我同时控制客户端和服务器软件,因此可以自由支配HTTP头集。在客户端之间是多个分层的web代理/缓存设备(think、Squid或类似设备)

源服务器提供的数据通常是高度可缓存的,我打算设置HTTP响应头来表明这一点。具体来说,我计划使用
缓存控制:public,max age=
。我理解这将意味着中间代理将缓存响应,直到指定的
最大年龄
,在这一点上,它们将根据源重新验证(可能使用上次修改的
头,查找
304
响应)

我遇到的问题是,客户端可能会意识到缓存中保存的数据现在可能无效。在这种情况下,我需要客户端发出一个请求,该请求指示缓存获取或使用源代码重新验证其响应。如果源响应现在不同,则缓存应存储此新响应。在我看来,这将涉及客户端发出请求,链中的每个缓存都应该使用下一个上游设备重新验证其响应,一直返回到源。然后,新的响应可以从实际拥有它的最近的缓存中得到服务

要实现这一点,需要在客户端请求上设置哪些正确的HTTP头?起初,我认为在HTTP请求中设置
Cache control:no Cache
会导致这种情况发生,但读取RFC时,这似乎会指示中间缓存返回原点(需要),但也不会缓存新响应(不需要)。然后我在一篇文章中看到,缓存控制:max age=0的HTTP请求头可能会这样做,但我不确定


max age=0
会做我在这里需要做的事情吗,还是我需要一些其他HTTP头的组合?

我在这里问了一个类似的问题:。我后来了解到,在撰写本文时,nginx不支持代理重新验证。计划在下个月举行

如果源站的原始响应包含正确的缓存控制头,则从客户端发送max age=0应在代理中触发此重新验证机制

但是,您的上游服务器是否会尊重这些头文件并使用它们的来源重新验证,这显然不是您可以假设的。如果你能控制你的上游服务器,我认为这是可行的

此外,etag优先于修改的,因为头部afaik

我发现这些文章对这个主题很有帮助:

[更新] Nginx版本1.5.8已经发布,我可以确认这个机制现在正在运行