如何通过签名URL在S3对象上定义Cache-Control标头?

cal*_*lum 7 javascript amazon-s3

按照本指南中的说明,我已设法通过签名网址上传.它看起来像这样:

const s3 = new aws.S3();

const s3Params = {
  Bucket: S3_BUCKET,
  Key: fileName,
  Expires: 60,
  ContentType: fileType,
  ACL: 'public-read',
  CacheControl: 'public, max-age=31536000',
};

s3.getSignedUrl('putObject', s3Params, (err, data) => {
  // ...
});
Run Code Online (Sandbox Code Playgroud)

...除了我的CacheControl参数(我自己添加;它不在指南中)似乎没有生效.当我使用上面的代码生成一个签名的URL并向其上传内容时,S3中的结果对象没有Cache-Control标题.

我究竟做错了什么?

Rob*_*ann 9

Cache-Control无论您在签名URL生成期间设置了什么,您都必须在上传请求中发送标头.

这是一个错误还是一个故意的行为是值得怀疑的,超出了我的回答能力.该Cache-Control头,为你注意到没有,是标识的URL的一部分,但无论什么原因,信息的文件上传,即在完全忽略.不在函数中指定CacheControl属性getSignedUrl()仍允许客户端将Cache-Control标头设置为他们选择的任何值.

如果您需要控制Cache-Control标题,那么使用getSignedUrl()它很可能不适合您的用例.

AWS现在支持一种名为AWS Signature第4版的新签名方案,该方案允许完全控制上载请求可能包含或不包含的内容,包括发送哪些标头以及具有哪些值.

JavaScript SDK支持这种新的签名版本:createPresignedPost().

有关如何生成此预签名POST策略以及上载表单应如何显示的详细示例,可以直接在AWS的文档中找到.

尽管该示例通过标准http上传<form>元素演示了文件上载,但原则可以应用于能够执行HTTP通信的任何客户端/消费者.

为了完整起见,以下是预签名POST策略的示例(以上链接的AWS文档页面):

{ "expiration": "2015-12-30T12:00:00.000Z",
  "conditions": [
    {"bucket": "sigv4examplebucket"},
    ["starts-with", "$key", "user/user1/"],
    {"acl": "public-read"},
    {"success_action_redirect": "http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html"},
    ["starts-with", "$Content-Type", "image/"],
    {"x-amz-meta-uuid": "14365123651274"},
    {"x-amz-server-side-encryption": "AES256"},
    ["starts-with", "$x-amz-meta-tag", ""],

    {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request"},
    {"x-amz-algorithm": "AWS4-HMAC-SHA256"},
    {"x-amz-date": "20151229T000000Z" }
  ]
}
Run Code Online (Sandbox Code Playgroud)

此POST策略在请求上设置以下条件:

  • 上传必须在2015年12月30日午夜UTC之前进行.
  • 内容只能上传到sigv4examplebucket.存储桶必须位于您在凭据范围(x-amz-credential表单参数)中指定的区域中,因为您提供的签名仅在此范围内有效.
  • 您可以提供以任何开头的任何密钥名称user/user1.例如,user/user1/MyPhoto.jpg.
  • ACL必须设置为public-read.
  • 如果上传成功,则会将用户的浏览器重定向到http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html.
  • 该对象必须是图像文件.
  • x-amz-meta-uuid标签必须设置为14365123651274.
  • x-amz-meta-tag可以包含任何价值.

请注意,在这个例子中的条件清单并非详尽无遗CacheControl 支持.请参阅创建POST策略文档,了解如何使用此文档.

  • 这是完全不正确的,您可以在`s3.getSignedUrl('getObject', options)`选项中设置`ResponseCacheControl` (3认同)