AWS S3+CloudFront托管站点深层路径访问报403的配置修复
问题现象
基于 AWS S3 + CloudFront 搭建的静态站点,分层路径访问出现异常:
- 访问根域名
https://mysamplesite.com时功能完全正常 - 直接访问深层路由
https://mysamplesite.com/some_link时,返回403拒绝访问错误,错误信息如下:
AccessDeniedAccess Denied DB93462807BAEBCE MSGCoilI76PVfdpFFEuabJ/bdc0lvdIhGZqzabrlcKMUQifBwu37RtoA32mvy3BmD/OPK0WlG70=
- 错误截图:

- 对照测试:直接通过开启了静态网站托管的S3站点端点访问同一路径
https://mysamplesite.s3-website-us-east-1.amazonaws.com/some_link,页面可正常打开
配置修正方向
出现这个现象基本都是CloudFront对接S3静态站点时的配置没配对,按顺序核对调整即可解决:
- 核对CloudFront源站配置
如果创建源站时直接选了内置的S3存储桶选项,CloudFront会默认对接S3的REST API端点。这类端点没有静态网站托管的路径解析能力:当请求路径找不到对应对象时,不会默认返回index.html,而是直接抛出AccessDenied的403错误。
修正方式:新建/修改源站类型为「自定义源站」,源站地址填你测试正常的S3静态网站端点域名,源站协议策略选HTTPS优先即可。 - 配置自定义错误响应规则
不管用哪种源站对接方式,只要是单页应用(SPA)架构,都需要在CloudFront中添加两条自定义错误响应:- 匹配HTTP状态码403,响应页面路径填
/index.html,响应状态码返回200 - 匹配HTTP状态码404,响应页面路径填
/index.html,响应状态码返回200
不配置这类规则时,碰到路由不匹配的请求会直接透传S3抛出的默认错误页面。
- 匹配HTTP状态码403,响应页面路径填
- 检查OAC关联权限(仅使用内置S3源站时需要)
如果为了走私有访问流程没接公开的S3静态网站端点,需要确认S3存储桶的权限策略已经授权CloudFront的OAC(源站访问控制)身份,允许对存储桶内所有对象执行s3:GetObject操作,否则所有非默认根路径的请求都会被S3拦截返回403。
内容的提问来源于stack exchange,提问作者John Grayson
相关产品推荐
相关产品推荐

