我正在使用名为images.example.com的Amazon S3存储桶,它使用以下网址通过Cloudflare CDN成功提供内容:
https://images.example.com/myfile.jpg
我想阻止图片和其他内容的热链接限制只能访问引用域:example.com以及我用作开发服务器的另一个域。
我尝试了一个存储桶策略,它允许来自特定域并拒绝任何域而不是特定域:
{
"Version": "2012-10-17",
"Id": "http referer policy example",
"Statement": [
{
"Sid": "Allow get requests referred by www.example.com",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::images.example.com/*",
"Condition": {
"StringLike": {
"aws:Referer": [
"http://www.example.com/*",
"http://example.com/*"
]
}
}
},
{
"Sid": "Explicit deny to ensure requests are allowed only from specific referer.",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::images.example.com/*",
"Condition": {
"StringNotLike": {
"aws:Referer": [
"http://www.example.com/*",
"http://example.com/*"
]
}
}
}
]
}
测试一下。我在不同的服务器上上传了一个小网页:www.notExample.com我尝试使用以下链接来链接图像:
<img src="https://images.example.com/myfile.jpg">
但无论如何都会显示热链接图片。
我还尝试了以下CORS规则
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>http://www.example.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
这些都没有阻止热链接。我尝试使用存储桶策略和CORS(一个或另外两个加上两个)的组合来清除CloudFlare中的缓存文件,但没有任何作用。
这似乎是一件相对简单的事情。我做错了什么?
答案 0 :(得分:3)
Cloudflare是一个内容分发网络,可以将信息缓存到最终用户附近。
当用户通过Cloudflare访问内容时,内容将从Cloudflare的缓存中提供。如果内容不在缓存中,Cloudflare将检索内容,将其存储在缓存中并将其提供给原始请求。
因此,您的Amazon S3存储桶策略将无法与Cloudflare一起使用,因为页面请求来自Cloudflare(不是用户的生成推荐人的浏览器),或直接来自Cloudflare的缓存(所以请求永远不会到达S3)。
您需要使用引荐来源规则配置Cloudflare ,而不是S3。
请参阅:What does enabling CloudFlare Hotlink Protection do?
一些替代方案:
referer
规则。 Amazon S3还支持您的应用程序可以生成的pre-signed URLs。