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

Django项目Amazon S3存储桶静态图片无法加载报AccessDenied错误

Django S3静态资源无法加载解决方案

1. 修复URL生成错误

你当前页面生成的图片链接存在渲染异常,URL末尾被错误拼接了HTML属性的转义内容:%22%20id=%22image%22%20style=%22width:%2040px;%20height:40px%22%3E,实际请求的资源路径并非你预期的/images/logo.png,这是模板语法错误导致的。

  • 检查Django模板内的图片标签写法,正确的静态资源引用格式如下:
<img src="{% static 'images/logo.png' %}" id="image" style="width: 40px; height:40px">
  • 确认你没有将标签的id、style等属性错误写入{% static %}标签的参数内,导致多余内容被拼接到静态资源URL后。

2. 修复S3 AccessDenied权限错误

URL修复后如果仍返回访问拒绝错误,按以下步骤排查:

2.1 配置S3存储桶公共访问权限

  • 进入S3控制台对应存储桶的「权限」 tab,关闭「阻止所有公共访问」的配置项(如果你的静态资源需要公开访问)
  • 给存储桶添加如下Bucket Policy,允许公开读取资源:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::django-ecommerce-files/*"
        }
    ]
}

2.2 核对Django S3配置

确认settings.py中django-storages的相关配置正确:

AWS_ACCESS_KEY_ID = "你的AWS访问密钥ID"
AWS_SECRET_ACCESS_KEY = "你的AWS秘密访问密钥"
AWS_STORAGE_BUCKET_NAME = "django-ecommerce-files"
AWS_S3_REGION_NAME = "你的存储桶所属区域,例如ap-southeast-1"
AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com"

# 静态资源配置
STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/"
STATICFILES_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"

2.3 检查文件对象权限

确认上传到S3的静态文件ACL属性为public-read,如果上传时未指定公开读取权限,即使存储桶配置了公共策略也会返回访问拒绝。你可以在S3控制台手动修改单文件权限,也可以在Django配置中添加参数自动设置上传文件的ACL:

AWS_S3_OBJECT_PARAMETERS = {
    'ACL': 'public-read',
    'CacheControl': 'max-age=86400',
}

内容的提问来源于stack exchange,提问作者Arun George

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:45:02