微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Google Cloud CDN“强制缓存所有内容”不缓存所有内容

如何解决Google Cloud CDN“强制缓存所有内容”不缓存所有内容

我将 Google Cloud CDN 用于我的 wordpress 网站 https://cdn.datanumen.com。我已启用“强制缓存所有内容”选项。但是,网页、css 文件、javascript 文件仍未缓存。仅缓存图像。

例如我在https://cdn.datanumen.com/处测试页面,我多次使用Ctrl + F5刷新网页,但总是得到相同的结果。

下面是我尝试加载的网页:

enter image description here

响应头中有“Cache-Control”字段,但没有“Age”字段。根据 Google 文档,如果缓存命中并提供缓存内容,则会出现“年龄”字段。所以没有“年龄”意味着文件没有被缓存。

我也检查了日志:

enter image description here

在日志中,cacheFillBytes 为 26776,cacheLookup 为 true。似乎 Google CDN 正在尝试查找缓存并用内容填充缓存。但是 statusDetails 显示“response_sent_by_backend”,因此内容仍然从后端提供。通常这应该只在我第一次访问网站时发生。但是对于我的情况,即使我多次按 Ctrl + F5 刷新我的网站,我也会得到相同的结果,statusDetails 永远不会显示 https://cdn.datanumen.com/

页面的“response_sent_by_cache”

为什么?

更新:

我注意到响应头中有一个vary”字段:

enter image description here

基于 https://cloud.google.com/cdn/docs/caching#non-cacheable_content,如果 vary 标头的值不是 Accept、Accept-Encoding 或 Origin,那么内容将不会被缓存,因为在我的情况下,“vary”标头是“Accept-Encoding, Cookie,User-Agent”,它不会被缓存。但我的问题是如何处理问题,让内容被强制缓存?

更新 2

我已将该站点更改为真正的 wordpress 站点,因为这正是我最终需要的。我打算使用 Google Cloud CDN 购买的支持,看看他们是否可以帮助解决这个问题。

解决方法

根据 Google Cloud CDN 的 documentation,解决问题的最佳方法实际上是使用 CACHE_ALL_STATIC 缓存模式:

  • CACHE_ALL_STATIC:自动缓存没有 no-store 或 private 指令的静态内容。设置有效缓存指令的源响应也被缓存。这是使用 gcloud 命令行工具或 REST API 创建的启用 Cloud CDN 的后端的默认行为。

  • USE_ORIGIN_HEADERS:需要原始响应来设置有效的缓存指令和有效的缓存标头。没有这些指令的响应是从源转发的。

  • FORCE_CACHE_ALL:无条件缓存响应,覆盖由源设置的任何缓存指令。如果后端提供私有的、针对每个用户的内容(例如动态 HTML 或 API 响应),则此模式不合适。

但在最后一种缓存模式的情况下,关于它的使用有两个警告

  1. 当您将缓存模式设置为 FORCE_CACHE_ALL 时,内容缓存的默认生存时间 (TTL) 为3600 秒(1 小时),除非您明确设置不同的 TTL。接受 1 小时的新默认 TTL 可能会导致一些以前被认为是新鲜的条目(由于来自原始标头的 TTL 更长)现在被认为是陈旧的。

  2. FORCE_CACHE_ALL 模式会覆盖缓存指令(Cache-Control 和 Expires),但不会覆盖其他源响应标头。特别是,Vary 标头仍然受到尊重,并且即使在 FORCE_CACHE_ALL 存在的情况下也可能抑制缓存。如需了解详情,请参阅不同的标头。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?