Django项目使用Amazon S3存储静态文件加载时报403错误求助
问题排查与修复方案
- 修复配置冲突项:你当前配置中同时设置了
AWS_S3_USE_SSL = False,但STATIC_URL与AWS_S3_ENDPOINT_URL均使用https协议,会导致AWS请求签名校验失败,直接触发403错误。建议直接删除AWS_S3_USE_SSL和AWS_S3_ENDPOINT_URL两行配置,你已经正确配置了存储桶区域和名称,django-storages会自动生成合法的访问地址,无需手动指定endpoint。 - 确认存储桶公共访问阻断规则:打开S3控制台对应存储桶的「权限」选项卡,找到「阻止公共访问(存储桶设置)」,需确保4个开关全部处于关闭状态,否则即使配置了公开ACL,请求也会被系统强制拦截返回403。
- 检查存储桶ACL开关与配置适配:如果你的存储桶设置为「ACL已禁用」,需要将
AWS_DEFAULT_ACL = 'public-read'修改为AWS_DEFAULT_ACL = None,完全通过桶策略控制访问权限即可。如果存储桶开启了ACL,保持原有配置即可。 - 配置正确的桶策略:在存储桶权限页的「桶策略」模块添加如下规则,替换其中的存储桶名称为你的实际桶名:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的实际存储桶名称/*" } ] }
- 验证已上传文件的权限:在S3控制台打开任意一个加载失败的静态文件详情页,检查权限配置中是否包含匿名用户的读取权限。如果没有,说明之前上传时权限配置未生效,重新执行
python manage.py collectstatic上传文件即可。 - 排查CORS规则:如果你的站点域名和S3访问域名不一致,需要在存储桶「权限」-「跨源资源共享(CORS)」中添加你的站点域名的允许规则,避免跨域请求被拦截。
内容的提问来源于stack exchange,提问作者user15256253
相关产品推荐
相关产品推荐

