在我的S3中,我将所有项目设置为私有,但添加了一个存储桶策略以允许我的网站读取文件。这很好。
我不明白的是,当我复制链接并在浏览器中打开它时,它会在我第一次尝试时实际打开文件,这不应该发生,但随后它从那里起作用,不允许用户访问。
为什么它允许用户在第一次尝试时通过?
清除缓存后,他们也可以再次访问该文件一次。我尝试使用对象的缓存元数据,这似乎没有什么区别。但是,当我单击s3控制台中的链接时,它永远不可访问。有没有人对此有解释,我该如何解决这个问题?
编辑:
{
"Version": "2012-10-17",
"Id": "http referer policy example",
"Statement": [
{
"Sid": "Allow get requests originated from www.example.com and example.com",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::example-bucket/*",
"Condition": {
"StringLike": {
"aws:Referer": [
"http://www.dev.example.co/*",
"http://dev.example.co/*"
]
}
}
}
]
}
这就是我的水桶政策。所有对象都将固定ACL设置为私有。
我还注意到,似乎完全忽略了存储桶策略。我创建了一个新的存储桶并将策略设置为拒绝任何访问,并将对象设置为私有,但我的网站仍然能够加载这些对象?有什么想法吗?
编辑2解决方案:
对于其他任何正在努力解决此类问题的人来说,这个问题与浏览器缓存有关。发生的事情是当有人在我的网站上查看文件时,该文件将存储在缓存中,这将允许用户在缓存中打开新窗口中的链接,从而不会阻止s3存储桶策略,因为该文件是刚从缓存中打开,实际上没有请求发送到亚马逊(据我所知)。当我将对象的Cache-Control参数更改为“no-cache'”时,我不再遇到此问题,因为无法从缓存中调用文件,而我的存储桶策略阻止了对它们的访问。希望能帮助别人。