You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:39:20