Cloudflare 未按预期缓存静态文件(cf-cache-status:MISS)

Cloudflare 未按预期缓存静态文件(cf-cache-status:MISS)

我想知道为什么 Cloulflare 不缓存某个静态 js 文件。

给出请求:

curl -I http://www.testlifeinuk.com/dist/lifeinuk.js

返回的标题如下:

HTTP/1.1 200 OK
Date: Mon, 12 Jan 2015 10:59:21 GMT
Content-Type: application/javascript
Connection: keep-alive
Set-Cookie: __cfduid=d11a9f01292153436a211a9d807a3399b1421060361; expires=Tue, 12-Jan-16 10:59:21 GMT; path=/; domain=.testlifeinuk.com; HttpOnly
X-Powered-By: Express
Etag: W/"507660-1420797981000"
Cache-Control: public, max-age=1382400
Last-Modified: Fri, 09 Jan 2015 10:06:21 GMT
Vary: Accept-Encoding
Via: 1.1 vegur
CF-Cache-Status: MISS
Expires: Wed, 28 Jan 2015 10:59:21 GMT
Server: cloudflare-nginx
CF-RAY: 1a78d818b4af0b81-LHR

令我困惑的是,无论我发出多少次请求,它总是返回

CF-Cache-Status: MISS

知道为什么吗?

答案1

您必须在 CloudFlare 管理面板中设置页面规则。使用页面规则的第一步是定义一个模式,该模式定义何时触发规则。这些模式可以很简单,例如单个 URL,也可以很复杂,包括多个通配符。假设您有一个具有单个 URL 的内容管理系统:

http://www.testlifeinuk.com

现在,如果您尝试使用 URL 模式创建规则:

http://www.testlifeinuk.com

仅主页会被缓存!

如果您想缓存整个网站,您必须按以下方式使用通配符:

 *testlifeinuk.com/*

这样,所有页面和资源将被 Cloudflare 缓存,如下所示:

http://www.testlifeinuk.com/dist/lifeinuk.js
http://www.testlifeinuk.com/mypage.html
https://www.testlifeinuk.com/mypage.html
https://testlifeinuk.com/mypage.html

标题的结果将是:

HTTP/1.1 200 OK
Date: Mon, 25 May 2015 10:21:05 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.39-0+deb7u2
Expires: Mon, 25 May 2015 10:51:05 GMT
Cache-Control: public, max-age=1800
Pragma: no-cache
Vary: Accept-Encoding
CF-Cache-Status: HIT            <<<<< Look this parameter
Server: cloudflare-nginx
CF-RAY: 1ec082ee43150e60-MXP
Content-Encoding: gzip

问候

答案2

除了 @Michelangelo 提到的您需要首先设置 CloudFlare 页面规则之外,您还需要确保正确设置响应标头,这样您就不会覆盖默认的缓存行为:

如果 Cache-Control 标头设置为“private”、“no-store”、“no-cache”或“max-age=0”,或者响应中存在 cookie,则 CloudFlare 将不会缓存该资源。否则,如果 Cache-Control 标头设置为“public”,且“max-age”大于 0,或者 Expires 标头设置为未来的任何时间,我们将缓存该资源。

看:https://support.cloudflare.com/hc/en-us/articles/202775670-How-Do-I-Tell-Cloudflare-What-to-Cache-

这就是为什么@Rudy Lee 说不要忘记设置maxAge选项,因为maxAgeExpress 中的默认值为 0。

看:https://expressjs.com/en/api.html#express.static

答案3

另一种可能性是,.htaccess 中定义的某些内容可能与 Cloudflare 的缓存冲突。如果在那里设置了 expires 标头,它们将覆盖 Cloudflare 的缓存设置。我发现我自己的网站就是这种情况,我最初甚至没有意识到这一点,直到我使用https://cf-cache-status.net

答案4

Cloudflare 文档中还缺少以下这句话:

如果您的原始服务器根本没有设置其中一个Cache-ControlExpires标头(即这两个标头都缺失),那么显然 Cloudflare 将默认MISS不管其缓存选项卡上的静态文件过期设置如何......

在这种情况下,你需要使用 Page Rules设置边缘缓存 TTL在这些资产上,为了剥离 cookie,你也可以设置缓存一切在同一规则内。

我已经使用 Cloudflare 并使用 LEMP 堆栈配置很多年了,但直到最近才注意到这种情况的发生......我可能错了,但我认为他们可能在过去 1-2 年内改变了这种行为,大约在同一时间他们调整了一些缓存选项卡功能。

相关内容