Django项目中Nginx访问AWS S3静态文件遇403禁止访问问题求助
解决Django+Nginx+AWS S3静态文件403 Forbidden问题
看起来你遇到的核心问题是S3拒绝了静态文件的访问请求,403错误通常和权限配置不匹配有关,结合你的场景,我给你一步步排查和解决的方案:
一、先排查AWS S3本身的权限配置(最常见原因)
1. 关闭S3桶的公共访问阻止设置
登录AWS控制台找到mysite-staging桶,进入「Permissions」标签页:
- 找到「Block Public Access (bucket settings)」,确保没有勾选「Block all public access」,同时取消勾选「Block public access to buckets and objects granted through any access control lists (ACLs)」——这两个选项会直接阻止静态文件被公开访问。
2. 添加正确的S3桶策略
在桶的「Permissions」→「Bucket Policy」里添加以下策略,允许任何人读取static/目录下的所有文件:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::mysite-staging/static/*" } ] }
3. 确保collectstatic上传的文件ACL为公开可读
修改Django项目的settings.py,强制上传的静态文件设置公开可读权限:
AWS_DEFAULT_ACL = 'public-read' AWS_S3_OBJECT_PARAMETERS = { 'CacheControl': 'max-age=86400', # 可选,设置缓存时间 }
配置完成后重新运行python manage.py collectstatic,确保新上传的文件权限正确。
二、调整Nginx配置(解决路径映射问题)
从你提供的浏览器请求路径来看,当前请求是直接访问S3的URL,但你的Nginx配置是代理/s3/路径到S3,这说明Django的静态文件URL和Nginx代理路径不匹配,你有两种选择:
方案1:让静态文件请求走Nginx代理
修改Django的settings.py,将静态文件URL指向Nginx的代理路径:
STATIC_URL = '/s3/static/'
然后更新Nginx配置,确保路径正确映射到S3的static/目录:
location /s3/static/ { proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header Authorization ''; proxy_set_header Host mysite-staging.s3.amazonaws.com; proxy_hide_header x-amz-id-2; proxy_hide_header x-amz-request-id; proxy_hide_header x-amz-meta-server-side-encryption; proxy_hide_header x-amz-server-side-encryption; proxy_hide_header Set-Cookie; proxy_ignore_headers Set-Cookie; proxy_intercept_errors on; add_header Cache-Control max-age=31536000; # 关键:把请求路径中的/s3/static/替换为S3上的static/ proxy_pass https://mysite-staging.s3.amazonaws.com/static/; }
方案2:直接让浏览器访问S3(不用Nginx代理)
如果不需要通过Nginx中转静态文件,直接修改Django的settings.py:
STATIC_URL = 'https://mysite-staging.s3.amazonaws.com/static/'
这种情况下你当前的Nginx/s3/配置可以保留但不会生效,因为请求会直接发送到S3,只要前面的S3权限配置正确就能访问。
三、额外排查点
如果以上步骤都完成还是403,检查S3桶的区域是否和你使用的Endpoint匹配:
- 比如你的桶在
us-west-2区域,S3的Endpoint应该是mysite-staging.s3.us-west-2.amazonaws.com,而不是默认的mysite-staging.s3.amazonaws.com,区域不匹配也会导致权限拒绝。
内容的提问来源于stack exchange,提问作者Jekson
相关产品推荐
相关产品推荐

