S3静态托管结合CloudFront OAI访问返回403拒绝问题如何解决
根因说明
你遇到的403错误是S3静态托管端点不支持CloudFront OAI校验导致的:
- OAI是AWS专为S3 REST API源站设计的访问控制机制,仅对格式为
my-bucket.s3.<region>.amazonaws.com的S3 REST端点生效 - 你使用的
my-bucket.s3-website-<region>.amazonaws.com是S3静态网站专属的HTTP服务端点,所有发往该端点的请求都会被判定为匿名请求,你配置的OAI桶策略不会对这类请求生效,因此只有开公共读才能正常访问。
修复配置步骤
你原来的S3桶策略完全符合要求,无需修改,仅调整CloudFront配置即可实现需求:
- 第一步:修改CloudFront源站配置,将源站地址从S3静态托管端点替换为S3 REST API端点
my-bucket.s3.my-region-1.amazonaws.com,源站类型选择「S3」,不要选择自定义源站 - 第二步:在当前源站的S3访问控制配置中,确认已关联你创建的OAI
FOO - 第三步:配置CloudFront默认根对象为
index.html,如果你的站点需要支持子路径自动解析index.html(如访问/about/返回/about/index.html),可以新增CloudFront自定义错误响应:将404错误的响应码修改为200,响应路径填写/index.html(适配SPA单页应用路由),或配置CloudFront Functions做路径重写适配多页站点的子目录解析 - 第四步:确认S3存储桶的「阻止全部公共访问」开关已开启,删除所有对象的公共读权限。
验证
等待CloudFront分发部署完成(通常5~10分钟)后,直接访问S3静态托管地址会返回403,仅通过CloudFront地址可以正常访问站点资源,无需额外配置对象公共权限,符合安全规范。
内容的提问来源于stack exchange,提问作者AlexDev
相关产品推荐
相关产品推荐

