Cache-Control Headers 在 CloudFlare 上不受尊重

Cache-Control Headers not respected on CloudFlare

我正在尝试缓存一些 html 页面,这与通过 CloudFlare 自动缓存图像的方式相同,但我无法让 CloudFlare 实际访问 html 的缓存。

根据文档(参考:https://support.cloudflare.com/hc/en-us/articles/202775670-How-Do-I-Tell-CloudFlare-What-to-Cache-),可以缓存 Cache-Control 设置为 publicmax-age 大于 0 的任何内容。

我在我的原始 Nginx 服务器上尝试了 headers 的各种组合,但都没有成功。从简单的Cache-Control: public, max-age=31536000到更复杂的headers包括s-maxage=31536000Pragma: publicETag: "569ff137-6"Expires: Thu, 31 Dec 2037 23:55:55 GMT都没有结果。

有什么想法可以强制 CloudFlare 从其缓存中为 html 页面提供服务吗?

PS:我在图像上得到 CF-Cache-Status: HIT,它工作正常,但在 html 页面上什么都没有,甚至 CF-Cache-Status: something 也没有。使用 html 页面的 CloudFlare 页面规则,它似乎工作正常,但我想避免使用一个,主要是因为它太特定于 CloudFlare。我不会从这些页面提供 cookie 或任何动态内容。

CF 文档非常不清楚。进入 "Page Rules",并根据通配符定义一个开启缓存的规则——然后它就会起作用。

我也偶然发现了这个。从页面上说

专业提示:从您的源发送缓存指令,以获取我们默认不缓存的具有扩展名的资源,这绝对没有任何区别。要为我们默认不缓存的扩展程序指定您的来源的缓存持续时间,您必须创建一个 Page Rule 到 "Cache Everything".

看来您必须设置页面规则才能将其用于 CloudFlare 默认不缓存的文件。此页面对此进行了更详细的描述,

https://blog.cloudflare.com/edge-cache-expire-ttl-easiest-way-to-override/

也就是说它对我仍然不起作用,而且似乎不受支持。在联系他们的支持人员后,他们证实了这一点。 Respect Origin Header 已从所有计划类型中删除。因此,如果您没有页面规则,他们将尊重来源 header。

但是,这无助于访问 html 页面的边缘缓存。为此,您已经设置了页面规则。一旦完成,我相信您可以将 max-age 设置为您的计划允许的最低值。再低一点,它就会变成 over-written。也就是说,如果没有页面规则,您可以说 Cache-Control: max-age:30 它会通过。使用包含边缘缓存的页面规则,您的 max-age 将受制于您的计划允许的最短时间,即使页面规则未指定浏览器缓存也是如此。

现在可以让 Cloudflare 尊重您的 Web 服务器 headers 而不是使用浏览器缓存 TTL 设置中描述的最小值覆盖它们。

首先导航到 Cloudflare 仪表板中的“缓存”选项卡:

从这里您可以向下滚动到 "Browser Cache Expiration" 设置,从这里您可以 select 下拉列表中的 "Respect Existing Headers" 选项:

进一步阅读:

注意: 如果未选择此设置,Cloudflare 将对 Cache-Control headers 应用默认的至少 4 小时。设置此设置后,Cloudflare 将不会触及您的 Cache-Control headers(即使它们很低或根本没有设置)。