通过CloudFront从S3托管Gatsby多页静态站访问子页面报403错误
问题核心原因
CloudFront的「默认根对象」配置仅对站点根路径/生效,访问子层级目录路径时,CloudFront不会自动在请求路径末尾拼接index.html去S3拉取对应文件,这就是不带后缀的子页面路径返回403、带/index.html后缀就能正常访问的根本原因。
非SPA场景的正确配置方案
因为站点为静态内容目录结构,不适合用全量403重定向到首页的SPA方案,按以下步骤调整即可实现目标效果:
- 替换CloudFront关联的S3源站地址:将当前配置的S3 REST API端点,替换为对应S3存储桶开启静态网站托管后生成的静态托管端点。S3静态托管服务本身内置目录访问逻辑,收到目录路径请求时会自动匹配同路径下的
index.html文件返回。 - 清理冗余的S3桶权限:当前桶策略中Sid为2、Sid为3的两条规则内容完全重复,属于冗余配置可直接删除其一;如果已通过CloudFront源访问身份(OAI)关联S3,可移除Sid为1的公开读规则,收敛访问权限,避免内容被绕过CloudFront直接从S3访问。
- 调整CloudFront行为配置:保持默认行为的路径匹配规则为
*,无需配置自定义错误响应指向根目录的index.html。透传S3静态托管端点的请求会自动触发S3侧的目录文件匹配逻辑,当访问http://example.com/path/to/directory时,会正常返回同路径下/path/to/directory/index.html的内容,不会出现错误跳转。 - 配置生效后做全路径验证:分别测试根路径、二级目录、深层嵌套目录的直接访问和刷新操作,确认所有路径均能正常加载对应内容,无403报错、无强制跳转首页的问题。
注意:Gatsby构建产出的静态站点本身就是按目录结构存储对应index.html的格式,和S3静态托管的目录映射逻辑天然适配,不需要额外添加路径重写规则。
内容的提问来源于stack exchange,提问作者user13553252
相关产品推荐
相关产品推荐

