我目前正在向具有config.assets.precompile << 'path/to/asset'
标头的用户提供HTML页面。我相信这允许用户&#39;浏览器将页面缓存最多10分钟。
我正在考虑在我的服务器前面添加一个CDN,由于上面的标题,它还应该将页面缓存最多10分钟。
如果用户在CDN缓存中获取该页面9分钟,比如说,它是否仍会在浏览器中缓存10分钟,总缓存时间为19分钟?或者它只会在浏览器中缓存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 CloudFront和Varnish(以及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=315360000
和Expires
。
因此,您可能需要检查特定CDN如何处理此问题。