CloudFront访问配置重定向的S3存储桶失效问题排查
问题根因
- 核心问题是CloudFront绑定的S3端点类型不对:你现在选的是S3原生REST API端点(就是建源的时候从自己账号下S3桶下拉列表直接挑的那个),搭配OAI做访问控制时,这个端点只认标准S3对象API请求,S3静态网站托管里配的重定向规则、首页/错误页规则在这个端点上完全不生效。你直接访问S3能正常跳转,是因为你访问的是S3给静态网站托管单独开的HTTP端点,格式一般是
<桶名>.s3-website-<区域>.amazonaws.com,这个端点和CloudFront现在连的REST端点是两套完全独立的逻辑,根本走不到一块去。 - 访问时返回
ListBucketResult的XML桶列表,是因为请求打到REST端点后,桶是空的找不到根路径对应的对象,你当前的权限又没禁掉列桶操作,S3直接返回了API层面的列桶结果,从根上就没触发静态网站的重定向流程。
修复方案
两种方案选一个就行:
方案1:保留OAI私有桶配置,用CloudFront Functions做重定向(推荐)
这个方案不用改S3的私有属性,安全性更好,重定向在CloudFront边缘节点直接返回,速度比走S3重定向快:
- 先改S3桶策略,把给OAI开的
s3:ListBucket权限删掉,只留s3:GetObject,从权限层面堵死返回桶列表的可能。 - 在对应CloudFront分发上建一个CloudFront函数,触发时机选查看器请求(Viewer Request),逻辑直接返回301跳转就行,参考代码:
function handler(event) { return { statusCode: 301, statusDescription: 'Moved Permanently', headers: { location: { value: 'https://my.app' } } }; }
- 把函数绑定到分发的默认缓存行为,发布后给分发做一次
/*全路径缓存失效,等部署完就正常了。
方案2:把CloudFront源换成S3静态网站端点,复用S3侧的重定向规则
如果你就是想把重定向规则放在S3侧维护,按下面改:
- 进S3桶的「静态网站托管」配置页,复制页面上给你生成的静态网站专属端点地址。
- 改CloudFront源配置:别从下拉列表选S3桶,选「自定义源」类型,把刚复制的静态网站端点填进去,源协议策略选仅HTTP——S3静态网站端点本身只支持HTTP访问,HTTPS由CloudFront侧负责卸载,不用在S3侧配证书。
- 注意:OAI只支持S3 REST API端点,绑静态网站端点的时候OAI是不生效的。你这个桶本身是空的,只有重定向规则没有私有文件,直接放开静态网站端点的访问权限就行,不会有数据泄露问题。
- 去CloudFront的错误页配置里,把403、404的缓存TTL改成0,清掉之前缓存的桶列表响应。
- 最后给分发做一次
/*全路径缓存失效,等部署完成测试就行。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

