Cache-Control如何:max-age受中间缓存的影响?

时间:2016-05-15 12:47:16

标签: http caching http-headers cache-control

我目前正在向具有config.assets.precompile << 'path/to/asset' 标头的用户提供HTML页面。我相信这允许用户&#39;浏览器将页面缓存最多10分钟。

我正在考虑在我的服务器前面添加一个CDN,由于上面的标题,它还应该将页面缓存最多10分钟。

如果用户在CDN缓存中获取该页面9分钟,比如说,它是否仍会在浏览器中缓存10分钟,总缓存时间为19分钟?或者它只会在浏览器中缓存1分钟?

1 个答案:

答案 0 :(得分:2)

这里有两种基本方法。

CDN可能会认为它是一个HTTP缓存,由RFC 7234定义。在这种情况下,它必须为缓存中的每个响应添加Age标头(不联系您的服务器)。它还必须保持您的服务器发送的Date标头。这使得下游缓存(例如浏览器的缓存)能够确定可以缓存响应的更多时间。

例如,如果您的服务器发送:

HTTP/1.1 200 OK
Server: nginx/1.9.12
Date: Sun, 15 May 2016 16:51:31 GMT
Cache-Control: max-age=600

然后缓存可能会发送:

HTTP/1.1 200 OK
Server: nginx/1.9.12
Date: Sun, 15 May 2016 16:51:31 GMT
Cache-Control: max-age=600
Age: 541
Via: 1.1 mycdn

此方法例如由Amazon CloudFrontVarnish(以及Fastly)使用。有时,缓存会出错:until a couple years ago,Varnish会错误地重置缓存响应中的Date标头。但是在我的实验中,Firefox和Chrome似乎并没有被这个混淆(因为Age仍然存在)。

或者,CDN可以决定它是HTTP 原始服务器,并通过其自己的规则与您的服务器合作。在这种情况下,它必须添加Age标头,并且必须重置 Date标头 - 但它也可以做任何事情想要其他标题,包括Cache-Control。例如,它可以将max-age递减对象在其缓存中花费的秒数:

HTTP/1.1 200 OK
Server: MyCDN/1.2.3
Date: Sun, 15 May 2016 17:00:32 GMT
Cache-Control: max-age=59

但它甚至可能不这样做,因为通常缓存对静态内容最有用,静态内容通常是“永久版本化”和“缓存”。因此,例如,每当您请求https://code.jquery.com/jquery-2.2.3.js时(由{{3提供服务​​) }},它将来会有相同的max-age=315360000Expires

因此,您可能需要检查特定CDN如何处理此问题。