将 Cloudfront 设置为从不重新获取资产

Posted

技术标签:

【中文标题】将 Cloudfront 设置为从不重新获取资产【英文标题】:setup Cloudfront to never refetch assets 【发布时间】:2012-02-14 15:48:24 【问题描述】:

我有 a Rails app 使用 Cloudfront 作为其 CDN 和 sprockets 来压缩资产并设置长 Cache-Control 标头。

对资产的第一次请求给了我这样的响应标头:

缓存控制:公共,最大年龄=31536000 连接:关闭 内容编码:gzip 内容类型:应用程序/javascript 电子标签:“892a3afb514e3c84646835f9ef101026” 最后修改时间:格林威治标准时间 2012 年 1 月 17 日星期二 16:05:17 服务器:瘦 1.2.11 代号 Bat-Shit Crazy 变化:接受编码 通过:1.0 c662f4e5a3bc7b224ce1bbecb0a23d82.cloudfront.net:11180 (CloudFront), 1.0 fc4797024fafe16fcc03e892c23f078d.cloudfront.net:11180 (CloudFront) X-Amz-Cf-Id:bd2a89fb81bba2513f30d6940347693ef483defb4783da06d81b002af23545c39b9176b2c7cb144f,VF69FYlYU8ezzHQp7QkU2GvEQ8NmDqEwRX-Tawu7H63yNqE1gl== X-Cache:来自云端的小姐 X-运行时:0.012413 X-Ua 兼容:IE=Edge,chrome=1

完美。它错过了来自 Cloudfront 的缓存,从我的应用程序中获取它,所以从现在开始它应该从那里加载它。

现在...如果我刷新页面,我会得到这些响应标头:

连接:保持活动 服务器:瘦 1.2.11 代号 Bat-Shit Crazy 通过:1.0 86123d99569c9296c8605243e9a10621.cloudfront.net:11180 (CloudFront), 1.0 de9fc23d505dae3d19973a98bfa1eba0.cloudfront.net:11180 (CloudFront) X-Amz-Cf-Id:a7bf6ffb30c43d306835190d210aeb8ec794c1ff619ad7aaecbad220c1822fe165bda624ae8382e1,bcij_88KOAvLPSqEKDRSvOBjEj7atiKBCAjSbqc2cfdb-BHOTi--LA== X-Cache:RefreshHit 从云端 X-运行时:0.006909 X-Ua 兼容:IE=Edge,chrome=1

看起来它击中了 Cloudfront。我得到一个304 not modified。所以看起来我没有再次下载文件但是,我看到这个请求也被发送到我的源服务器。

为什么会这样? Cloudfront 现在不应该总是缓存我的资产吗?我正在对我的资产进行版本控制,所以我真的不希望从服务器获取它,除了第一个请求。有什么办法可以强制这种行为?

【问题讨论】:

【参考方案1】:

原来是 Cloudfront won't respect the Cache-Control header if no Date header is set。

在资产中添加日期标题可以解决所有问题。

【讨论】:

以上是关于将 Cloudfront 设置为从不重新获取资产的主要内容,如果未能解决你的问题,请参考以下文章

S3 + Cloudfront 上的浏览​​器缓存破坏

不安全登录被阻止:您无法获取访问令牌或从不安全页面登录到此应用程序。尝试将页面重新加载为 https://

从不使用 Angular 服务器端渲染的资产中获取文件

Rails 应用程序 - 使用 Cloudfront 和 Heroku 进行资产交付

Rails assets_host、cloudfront 和 heroku

在进行滚动部署时,如何确保 Cloudfront 具有正确的资产版本?