AWS S3存储桶文件无法访问:是否需配置存储桶策略?
解决S3存储桶对象访问403 Forbidden的配置方案
核心原因
S3存储桶及对象默认处于私有状态,IAM用户拥有上传权限仅代表该用户能操作桶内资源,但外部(浏览器、应用播放器)通过URL直接访问时属于匿名请求,无读取权限,因此返回403错误。
存储桶策略配置步骤
- 登录AWS控制台进入S3服务,找到目标存储桶
- 切换至权限标签页,点击存储桶策略的「编辑」按钮
- 粘贴以下策略代码,替换
<BUCKET_NAME>为你的实际桶名:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<BUCKET_NAME>/*" } ] }
- 保存策略
策略说明
Principal": "*":允许所有用户(含匿名用户)执行指定操作"Action": "s3:GetObject":授予读取对象的权限"Resource": "arn:aws:s3:::<BUCKET_NAME>/*":权限覆盖桶内所有对象;若仅需开放特定目录,可修改为arn:aws:s3:::<BUCKET_NAME>/<DIR>/*
额外必查项
- 阻止公共访问设置:在权限标签页的「阻止公共访问(存储桶设置)」中,确保未勾选「阻止所有公共访问」(需公开访问时)
- 对象ACL配置:若上传时未指定公共权限,需在Laravel上传代码中添加公开标识,确保对象继承可读权限:
Storage::disk('s3')->put($path, $file, 'public');
权限安全建议
- 若文件无需公开访问,不要使用上述公开策略,改用Laravel生成的预签名URL提供临时访问权限:
$url = Storage::disk('s3')->temporaryUrl($path, now()->addMinutes(30));
- 遵循最小权限原则:仅开放必要目录或对象的读取权限,避免过度授权
内容的提问来源于stack exchange,提问作者James Stewart
相关产品推荐
相关产品推荐

