为什么我的CDN会缓存某个文档,而浏览器却不缓存?

时间:2018-09-28 23:41:06

标签: cdn azure-cdn

我有一个带有测试PDF的URL,这是我的来源: https://powered-by.qbank.se/miso/MISO_Testing_Document279626.pdf

我使用Microsoft提供程序在Azure CDN中进行了原始设置。它的网址是: https://misocdn-fail.azureedge.net/MISO_Testing_Document279626.pdf

当我在原始站点上更新PDF时,我测试过的所有浏览器都将在不刷新F5甚至不按ctrl-F5的情况下带回新文档。但是,CDN基本上是无限期地继续缓存PDF(根据文档或直到我清除前的2天)

我的问题是,为什么我的CDN不能检测到原始数据,而浏览器却可以检测到变化?

我了解CDN会缓存,但是我不了解浏览器正在做什么,以发现此内容是新内容?

1 个答案:

答案 0 :(得分:0)

为了更好地理解这种现象,这是一个避免从直接访问URL接收到的响应标头的好开始。 一种方法是在终端中使用curl -I <YOUR_URL>

您将看到类似的内容:

HTTP/1.1 200 OK
Date: Mon, 01 Oct 2018 09:03:57 GMT
Server: Apache
Last-Modified: Fri, 28 Sep 2018 19:11:57 GMT
ETag: "11ff1-576f33ab4c2a0"
Accept-Ranges: bytes
Content-Length: 73713
Cache-Control: max-age=86400
Expires: Tue, 02 Oct 2018 09:03:57 GMT
Content-Type: application/pdf

在这些标头中,浏览器使用Cache-ControlETagLast-Modified来确定所请求内容的新鲜度。 Cache-Control: max-age=<seconds>是将资源视为新鲜资源的最长时间(相对于请求时间)。

现在,根据Mozilla开发人员网络–MDN– Freshness的描述如下:

  

资源一旦存储在缓存中,理论上就可以永远由缓存提供服务。缓存的存储空间有限,因此会定期从存储中删除项目。此过程称为缓存逐出。另一方面,服务器上的某些资源可能会更改,因此应更新缓存。由于HTTP是客户端-服务器协议,因此服务器在资源更改时无法联系缓存和客户端。他们必须传达该资源的到期时间。在此到期时间之前,资源为新鲜;到期后,资源已过时。驱逐算法通常将新资源优先于陈旧资源。注意,过时的资源不会被驱逐或忽略。当高速缓存接收到过时资源的请求时,它将使用If-None-Match转发此请求,以检查它是否实际上仍然是最新的。如果是这样,服务器将返回304(未修改)标头,而不发送请求资源的主体,从而节省了一些带宽。

因此,要验证缓存的资源,如果ETag标头是资源响应的一部分,浏览器将发出If-None-Match标头。

这是使您的浏览器在直接访问时下载pdf新版本的机制。另请注意,这些标头也存在于CDN网址的请求中,但CDN边缘服务器仍在存储您的旧文件。

关于CDN缓存,不考虑ETagLast-Modified标头。原始服务器在HTTP响应中仅Cache-Control头定义了资源的生存时间(TTL)。您的情况是86400秒。因此,从理论上讲,从CDN链接发出第一个请求后的第一天,便会提供新版本的pdf。 直到那时,旧的pdf仍将由CDN边缘服务器托管。您可以在Azure CDN文档中阅读有关Azure CDN expiration management的更多信息。