如何让AWS S3存储桶内所有文件夹中的文件公开访问?
解决AWS S3非根目录文件无法公开访问的问题
1. 修正桶策略中的桶名
你当前桶策略里Resource字段的*my-bucket-name*是占位符,必须替换为真实的存储桶名称,不能保留星号。正确格式如下:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AddPerm", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的真实桶名/*" } ] }
2. 关闭S3公共访问阻止设置
AWS默认强制阻止公共访问,即使桶策略配置正确也会失效。进入存储桶的权限标签,找到“公共访问设置”,关闭以下所有选项:
- 阻止新的公共存储桶策略
- 阻止公共和跨账户访问(如果存储桶有公共策略)
- 关闭所有公共ACL的公共访问
- 阻止跨账户访问(如果存储桶有公共ACL)
3. 检查文件对象的ACL权限
若上传文件时未指定公共权限,对象本身会保持私有状态:
- 现有文件:在S3控制台选中文件,进入“权限”标签,将对象ACL设置为“公共读取”;也可通过AWS CLI批量修改:
aws s3 cp s3://你的桶名/tmp/ s3://你的桶名/tmp/ --recursive --acl public-read - Node.js上传新文件:在上传代码中添加
ACL: 'public-read'参数,示例:const s3 = new AWS.S3(); s3.putObject({ Bucket: '你的桶名', Key: 'tmp/目标文件名', // 注意不要带./,S3路径前缀直接写tmp/ Body: 文件内容, ACL: 'public-read' }, (err, data) => { // 处理回调逻辑 });
4. 确认访问URL的正确性
S3文件的合法访问URL有两种格式,注意不要包含./:
- 普通对象URL:
https://你的桶名.s3.区域.amazonaws.com/tmp/文件名 - 静态网站托管URL(若开启):
http://你的桶名.s3-website.区域.amazonaws.com/tmp/文件名
如果你的Node.js上传时用了./tmp/作为前缀,会导致对象Key变成./tmp/文件名,此时URL需对应为https://你的桶名.s3.区域.amazonaws.com/./tmp/文件名,但更规范的做法是去掉./,直接用tmp/作为前缀。
内容的提问来源于stack exchange,提问作者Joao Fernando Fernandes Montes
相关产品推荐
相关产品推荐

