没有caching控制标题,用于AWS CloudFront与S3 Origin的文件

我们刚刚迁移到Amazon AWS。 我们目前有一个EC2实例运行良好。 它在前端运行Nginx,在后端运行Apache。 这也运行良好。 所有站点都正确启动,并包含由EC2提供的文件的caching控制头。

问题在于我们放置在Amazon S3中的所有静态文件都是通过CloudFront CDN访问的。 我们可以很好地访问这些文件(而CORS也没有问题),但显然CloudFront不提供具有Cache-Control头文件。 我们希望利用浏览器caching。

我看到它的方式,EC2实例在这里没有扮演一个angular色,因为静态文件是由S3 + CloudFront直接提供的,请求不会转到EC2中的Web服务器。

我完全迷失了。

问题:1)在这种情况下,如何设置Cache-Control? 2)是否可以设置caching控制? 从S3还是CloudFront?

注意:我已经在Google上打了几页,您可以在S3中为单个对象设置标题。 这实在不是一个有效的方法,因为在我的情况下,我们正在谈论几个对象。

谢谢!

我已经在Google上打了几页,您可以在S3中为单个对象设置标题。 这实在不是一个有效的方法,因为在我的情况下,我们正在谈论几个对象。

那么,“生产力”与否,这是它的实际devise工作。

CloudFront不添加 Cache-Control:标题。

除非另外configuration,否则 CloudFront 将传递源服务器提供的Cache-Control:标头(在本例中为S3)。

为了得到Cache-Control:当提取对象时由S3提供的头部,当对象被上传到S3中时,必须提供它们,或者通过随后的put + copy操作将其添加到对象的元数据中,这可以用于内部复制在S3中将自己对象本身,修改过程中的元数据。 如果您编辑对象元数据,则这是控制台在幕后执行的操作。

还有(如果你想知道)在S3没有全局设置强制桶中的所有对象返回这些头 – 这是一个每对象的属性。


更新: Lambda @ Edge是CloudFront中的一项新function,它允许您针对请求和/或响应,浏览器与caching之间和/或caching与来源之间的触发,触发Node.js中针对简单请求/响应对象结构由CloudFront公开。

此function的主要应用之一是操纵标题…所以,虽然上述仍然是准确的 – CloudFront本身不添加Cache-Control – 现在可以使用Lambda函数将它们添加到返回的响应来自CloudFront。

只有在响应中没有Cache-Control头时Cache-Control: public, max-age=86400本示例才会添加Cache-Control: public, max-age=86400

在原始响应触发器中使用此代码会在每次CloudFront从原点获取对象时触发该代码,并在CloudFront将其caching之前修改响应。

 'use strict'; exports.handler = (event, context, callback) => { const response = event.Records[0].cf.response; if(!response.headers['cache-control']) { response.headers['cache-control'] = [{ key: 'Cache-Control', value: 'public, max-age=86400' }]; } callback(null, response); };