CloudFlare不遵守缓存控制头信息

6

我正在尝试让一些HTML页面被缓存,就像图片通过CloudFlare自动缓存一样,但是我无法让CloudFlare实际上命中其缓存。

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

我在我的源Nginx服务器上尝试了各种组合的头部,但都没有成功。从简单的Cache-Control: public, max-age=31536000到更复杂的头部,包括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。使用CloudFlare页面规则的HTML页面似乎可以正常工作,但我想避免使用它,主要是因为它太依赖于CloudFlare。我没有从这些页面中提供cookie或任何动态内容。

3个回答

7
现在可以让Cloudflare尊重您的Web服务器标头,而不是使用浏览器缓存TTL设置中描述的最小值覆盖它们。
首先,请转到Cloudflare仪表板中的缓存选项卡:

Cloudflare Dashboard Caching tab

从这里您可以向下滚动到“浏览器缓存过期”设置,从这里您可以在下拉菜单中选择“尊重现有标头”选项:

Respect Existing Headers Cloudflare

进一步阅读:

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


3
我也碰到了这个问题。从页面上可以看到:
专业提示:对于我们默认不缓存的资源发送缓存指令将没有任何作用。要为我们默认不缓存的扩展名指定缓存持续时间,您必须创建一个“缓存所有内容”的页面规则。
因此,似乎您必须设置页面规则才能在CloudFlare不默认缓存的文件中使用它。该页面更详细地描述了这一点。

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

尽管如此,对我来说仍然没有起作用,并且似乎不受支持。在联系他们的支持部门后,他们确认了这一点。Respect Origin Header已从所有计划类型中删除。因此,如果您没有页面规则,它们将尊重原始标头。
但是,对于访问其HTML页面边缘缓存来说,这并没有帮助。为此,您需要设置一个页面规则。完成后,您可以将最大年龄设置为计划允许的最低值。任何较低值都会被覆盖。也就是说,如果没有页面规则,您可以说Cache-Control:max-age:30,它会通过。但是,如果包括边缘缓存的页面规则,则您的max-age最小时间将成为适用,即使页面规则未指定浏览器缓存。

1
我现在有一个关于这个问题的未解决工单。似乎无法做到像尊重所有URL上的缓存头这样简单的事情。要么您不包含页面规则,这意味着只有样式表等会遵循源头的头文件进行缓存,要么您创建一个简单的“全部缓存”页面规则,突然源头头文件被忽略了! - mahemoff
只是被忽略了一部分,因为它们比您的计划允许的长度要短。 - Jim Lowrey

0

CF文档非常不清晰。进入“页面规则”,并定义一个基于通配符的缓存开启规则,然后它就可以起作用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接