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

为何FTP上传至AWS S3存储桶的资源前端访问出现403权限拒绝?

问题分析与解决方案

这大概率不是你当前的IAM用户策略问题,而是FTP上传的对象本身的访问控制列表(ACL)没有允许匿名/公共读权限导致的403错误,我帮你拆解下原因和解决办法:

核心原因

你遇到的差异其实是两种上传方式的ACL默认设置不同:

  • 通过Craft CMS上传文件时,CMS会自动为对象配置适合前端匿名访问的ACL(比如public-read),所以前端访客能正常打开图片;
  • 而用Transmit FTP上传时,工具默认会给对象设置私有ACL(仅对象所有者拥有访问权限),前端的匿名请求没有权限读取这些对象,自然会返回AccessDenied错误。

解决方案

1. 手动修正单个对象的ACL

如果你只需要修复少数文件,可以直接在AWS控制台操作:

  • 登录AWS S3控制台,找到无法访问的图片对象;
  • 切换到「权限」标签,找到「访问控制列表(ACL)」区域;
  • 点击「编辑」,添加「Everyone (public access)」的「读取」权限,保存后刷新前端页面测试。

2. 修改Transmit FTP的默认上传ACL

为了避免后续上传的文件再踩坑,调整Transmit的默认设置:

  • 打开Transmit,找到你的S3连接;
  • 右键点击连接选择「Get Info」(或直接进入连接设置界面);
  • 在「Advanced」或「S3 Options」分类下,找到「Default ACL」选项;
  • 将其设置为public-read,保存后再上传的文件会自动应用这个权限。

3. 批量修正已上传文件的ACL

如果已经上传了大量文件,用AWS CLI批量处理更高效:

# 把bucketname替换成你的实际存储桶名称
aws s3 cp s3://bucketname/ s3://bucketname/ --recursive --acl public-read

这条命令会递归遍历桶内所有对象,统一将它们的ACL设置为允许公共读。

4. (可选)通过桶策略强制公共访问(谨慎使用)

如果你确定桶内没有敏感数据,希望所有对象都允许匿名访问,可以给存储桶添加一条桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicReadAccess",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucketname/*"
        }
    ]
}

⚠️ 注意:添加这条策略前,需要先关闭S3存储桶的「阻止公共访问」设置(在桶的「权限」标签下找到该选项,取消勾选相关限制)。

内容的提问来源于stack exchange,提问作者M dunbavan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:16:56