S3存储桶策略阻止boto设置缓存标头

时间:2012-12-26 20:56:46

标签: python amazon-s3 boto

我使用boto库开发了一个Python脚本,将文件上传到我的S3存储桶。使用Key.set_contents_from_filename方法上传文件时,我指定Cache-ControlExpires标头以启用正确的浏览器缓存。这一切都运行正常,文件显示在我的桶中,并在元数据字段中设置了正确的标题。

为了防止我的文件热链接,我在S3中添加了以下存储桶策略:

{
    "Version": "2008-10-17",
    "Id": "MySite",
    "Statement": [
        {
            "Sid": "Deny access if not specified referrer",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::mybucket/*",
            "Condition": {
                "StringNotLike": {
                    "aws:Referer": [
                        "http://www.mysite.com/*",
                        "http://mysite.com/*"
                    ]
                }
            }
        }
    ]
}

此政策有助于防止热链接,但现在当我使用boto上传文件时,Cache-ControlExpires标头未设置。删除存储桶策略可以解决问题,因此我显然没有正确指定存储桶策略。

有关如何修改我的存储桶策略以允许使用boto上传元数据字段同时仍然阻止热链接的任何想法?

1 个答案:

答案 0 :(得分:0)

我自己没有测试过标题。但也许问题在于Referer标题。我建议您添加此策略,允许使用Referer将get和put对象添加到您的存储桶中。

{
"Version": "2008-10-17",
"Statement": [
    {
        "Sid": "AllowFromReferer",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::745684876799:user/IAM_USER"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::BUCKET_NAME/*",
        "Condition": {
            "StringLike": {
                "aws:Referer": [
                    "http://mysite.com/*",
                    "http://www.mysite.com/*"
                ]
            }
        }
    }
]
}

如果失败,您可以认为问题出在Referer上。只使用*作为referer,如果它工作正常,那么它肯定是你的Referer问题。