我需要为整个S3存储桶设置缓存控制头信息,包括现有的和将来上传的文件,并希望通过存储桶策略进行设置。
我知道如何编辑现有的缓存控制头信息,并且知道如何在自己上传文件时指定这些头信息,但不幸的是,上传文件的应用程序无法设置这些头信息,因为它使用S3fs将文件复制到S3中。
现在有3种方法可以完成此操作:通过AWS控制台、通过命令行或通过s3cmd命令行工具。
这是目前推荐的解决方案。它很简单,但可能需要一些时间。
最初,当我创建这个存储桶时,策略是不可行的,所以我想到了如何使用aws-cli来完成它,而且非常流畅。在研究时,我找不到任何实际应用的例子,所以我想发布一些我的解决方案,以帮助有需要的人。
注意:默认情况下,aws-cli仅复制文件的当前元数据,即使您指定了新元数据。
要使用在命令行上指定的元数据,需要添加“--metadata-directive REPLACE”标志。以下是一些示例。
对于单个文件
aws s3 cp s3://mybucket/file.txt s3://mybucket/file.txt --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public
对整个存储桶进行操作(注意--recursive标志):
aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public
我发现一个小问题,如果你只想针对特定的文件类型进行应用,你需要排除所有的文件,然后再包括你想要的那些。
仅限于jpg和png文件:
aws s3 cp s3://mybucket/ s3://mybucket/ --exclude "*" --include "*.jpg" --include "*.png" \
--recursive --metadata-directive REPLACE --expires 2034-01-01T00:00:00Z --acl public-read \
--cache-control max-age=2592000,public
如果您需要更多信息,请参考以下手册链接:
已知问题:
"Unknown options: --metadata-directive, REPLACE"
这可能是由于awscli版本过旧导致的 - 请参见下面@eliotRosewater的答案
S3cmd是一个“用于管理Amazon S3和CloudFront服务的命令行工具”。虽然此解决方案需要 git pull,但它可能是一种更简单、更全面的解决方案。
有关完整说明,请查看@ashishyadaveee11在下面发布的帖子
cp
命令是否会下载并重新上传所有内容? - mlissner现在,可以轻松地从AWS控制台更改它。
执行时间取决于您的存储桶文件数量。 如果意外关闭浏览器,请重新开始操作。
步骤
git clone https://github.com/s3tools/s3cmd
s3cmd --configure
(你将被要求提供两个密钥 - 从确认电子邮件或亚马逊帐户页面复制并粘贴它们。复制时要小心!它们区分大小写,必须准确输入,否则您将继续收到有关无效签名或类似错误的错误消息。
记得为密钥添加 s3:ListAllMyBuckets
权限,否则在测试访问权限时将收到 AccessDenied
错误。)./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/
我一直在苦苦思索这个问题,直到我找到并阅读了文档。在这里分享,以帮助其他人:
最终对我有效的命令是这个。我选择了 1 秒的过期时间进行测试,以验证预期结果:
aws s3 cp \
--metadata-directive REPLACE \
--cache-control max-age=1,s-maxage=1 \
s3://bucket/path/file \
s3://bucket/path/file
--metadata-directive REPLACE
max-age
以秒为单位设置浏览器缓存时间s-maxage
以秒为单位设置CloudFront缓存时间同样地,如果在上传到S3时设置这些Cache-Control
头值,则命令将如下所示:
aws s3 cp \
--cache-control max-age=1,s-maxage=1 \
/local/path/file \
s3://bucket/path/file
将对象复制到自身 在 S3 上设置适当的 cache-control
标头以进行复制操作。
在文件的 URL 中指定响应标头。您需要使用预签名 URL 才能使其正常工作,但您可以在查询字符串中指定某些响应标头,包括 cache-control
和 expires
。要获取可用选项的完整列表,请参见:http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225
之前的答案误导了我,所以我想分享一下我的使用方法。AWS CLI 只需要两个命令:
aws s3 cp s3://bucketname/ s3://bucketname/ --cache-control max-age=12345 --recursive
--cache-control
就可以了。aws s3 sync z:\source\folder s3://bucketname/folder --delete --cache-control max-age=12345 --acl public-read
--metadata-directive
,因为使用它会导致你猜测的内容类型丢失,这将使像图像之类的东西在浏览器中无法显示而立即下载。我的解决方案保留了猜测的值,并允许与同步一起猜测。之前的回答或者与问题不太相符,或者会产生费用(Lambda)。
你应该在上传文件时设置“cache-control”头部(PutObject或MultiPartUpload)。
根据你使用的语言,具体操作可能有所不同。文档并不十分清晰(AWS希望你使用其他解决方案支付他们的费用)。
以下是PHP代码示例:
$uploader = new MultipartUploader ($s3,$filename,[
...,
'before_initiate' => function(\Aws\Command $command){
$command['CacheControl'] = 'max-age=31536000,public';
},
...
]);
cc := "max-age=31536000,public"
input := &s3.PutObjectInput{
...,
CacheControl: &cc,
}
cache-control: max-age
的人,请参考这个帖子中的答案; 对于通过aws s3
推送资源的任何人,另一种解决方案是通过--cache-control max-age=
设置一个值。 - Fabien Snauwaert