AWS S3+CloudFront托管静态网站子路径刷新报AccessDenied求助
问题排查与解决方案
1. 修复CloudFront路径重写逻辑
直接访问example.cloudfront.net/about/时,CloudFront默认会向S3请求about/资源,但S3中不存在这个“文件夹”实体,实际对应文件是about/index.html。需通过CloudFront函数重写路径:
- 创建CloudFront函数,代码如下:
function handler(event) { const request = event.request; const uri = request.uri; if (uri.endsWith('/')) { request.uri = uri + 'index.html'; } return request; } - 将函数关联到CloudFront分发的查看器请求阶段,路径模式设为
/*,确保所有末尾带斜杠的路径都会被重写为对应index.html文件的请求。
2. 验证S3桶策略的权限范围
确认CloudFront原点访问身份(OAI)拥有访问S3所有对象的权限,桶策略需包含以下语句(替换占位符为你的实际信息):
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "AllowCloudFrontOAI", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity YOUR_OAI_ID" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*" } ] }
注意Resource必须是arn:aws:s3:::YOUR_BUCKET_NAME/*(覆盖所有子对象),而非仅桶本身,否则嵌套路径的文件会被拒绝访问。
3. 检查CloudFront原点配置
- 确保CloudFront的原点指向S3的REST端点(格式如
your-bucket.s3.amazonaws.com),而非S3静态网站托管的HTTP端点(这类端点要求桶公开,不符合你的需求)。 - 关闭S3端的静态网站托管功能,避免路径解析逻辑冲突,所有路由逻辑由CloudFront处理。
4. 清除CloudFront缓存残留
重新搭建服务后可能存在旧缓存,手动触发缓存失效:
- 在CloudFront控制台找到对应分发,进入缓存失效页面,添加路径
/about/和/about/index.html,提交失效请求,强制CloudFront获取最新配置与内容。
内容的提问来源于stack exchange,提问作者emilok
相关产品推荐
相关产品推荐

