Amazon S3桶策略结合CloudFront使用Referer条件的访问问题
解决CloudFront搭配S3时Referer访问控制失效问题
问题根源
通过CloudFront访问S3时,CloudFront默认不会将客户端的Referer请求头转发给S3源站,导致你配置的S3桶策略中aws:Referer条件无法匹配CloudFront OAI的请求,直接返回拒绝。而直接访问S3时,客户端的Referer头会直接发送给S3,所以策略能正常生效。
解决方案
步骤1:配置CloudFront转发Referer头到S3
- 登录AWS CloudFront控制台,找到目标分发,进入「行为」标签页
- 编辑对应的行为(比如默认行为)
- 在「源请求策略」区域:
- 若已有自定义源请求策略,确认策略中包含
Referer头的转发规则 - 若无,点击「创建源请求策略」,在「包含的头」中选择「添加自定义」,输入
Referer,完成创建后关联到该行为
注:如果是旧版CloudFront配置,在「转发 Headers」中选择「白名单」,并添加
Referer到白名单列表 - 若已有自定义源请求策略,确认策略中包含
步骤2:优化S3桶策略(增强安全性)
原有策略中允许所有AWS用户通过Referer访问S3存在安全风险,建议只保留CloudFront OAI的访问规则,同时保留Referer验证:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CloudFrontOAIWithReferer", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity AAAAAAAAAAA" }, "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ], "Condition": { "StringLike": { "aws:Referer": [ "https://dev.mycompany.com/*", "https://mycompany.com/*" ] } } } ] }
注意:将
DOC-EXAMPLE-BUCKET替换为你的实际桶名,AAAAAAAAAAA替换为你的CloudFront OAI ARN;同时Referer值建议加上*后缀,匹配网站子页面的请求
验证效果
- 等待CloudFront分发配置更新完成(通常需要5-15分钟)
- 在你的网站内测试CloudFront域名的视频链接,确认可以正常播放
- 直接在浏览器地址栏打开CloudFront视频链接,确认返回「Access Denied」
内容的提问来源于stack exchange,提问作者ForWebTech
相关产品推荐
相关产品推荐

