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

How is Cache-Control: max-age affected by intermediate caching?

我目前正在为 Cache-Control: max-age=600 header 的用户提供 HTML 页面。我相信这允许用户的浏览器缓存页面最多 10 分钟。

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

如果用户在CDN缓存9分钟后获取该页面,那么是否还会在浏览器中缓存10分钟,总缓存时间为19分钟?还是只会在浏览器中缓存1分钟?

这里有两种基本方法。

CDN 可能会决定它是一个 HTTP 缓存,由您的服务器发送的 RFC 7234. In that case, it must add an Age header to every response that it serves from cache (without contacting your server). It must also keep the Date header 定义。这使下游缓存(例如浏览器的缓存)能够确定它可以缓存响应的时间更多

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

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 CloudFront and by Varnish (and thus by Fastly). Sometimes, caches get it wrong: until a couple years ago 使用了这种方法,Varnish 会错误地重置缓存响应的 Date header。不过,在我的实验中,Firefox 和 Chrome 似乎并没有因此而混淆(因为 Age 仍然存在)。

或者,CDN 可能会决定它是一个 HTTP 原始服务器,并根据其 自己的 规则与您的服务器合作。在那种情况下,它必须 而不是 添加 Age header,并且它必须 重置 Date header——但是它也可以对其他 header 做任何它想做的事情,包括 Cache-Control。例如,它可以将 max-age 减少 object 在其缓存中花费的秒数:

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(由 MaxCDN 提供服务),它都带有相同的 max-age=315360000 和一个遥远的未来 Expires

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