CloudFront访问S3托管的NextJS应用刷新报AccessDenied,直连S3正常
根本原因
你遇到的问题核心是CloudFront源站配置错误:你给CloudFront关联的是S3默认的REST API端点,而非S3开启静态网站托管后提供的Web端点,二者行为差异如下:
- S3静态网站托管端点:会自动解析路径下的默认索引文件,你访问
/articles/时会自动返回路径下的index.html文件,这也是你直接访问S3静态站点URL时刷新正常的原因 - S3 REST API端点:没有自动索引解析能力,你访问
/articles/时会直接尝试读取桶中名为articles的对象,对象不存在时会因为你没有配置桶列表权限,直接返回AccessDenied错误,而非你预期的404或者索引文件
站内点击跳转正常是因为NextJS走的是客户端路由,没有实际向服务端发起新的页面请求,只有刷新页面时才会触发真实请求,所以只有刷新时会报错。
解决步骤
1. 替换CloudFront源站地址
- 打开S3控制台,进入对应存储桶的「属性」标签页,拉到最底部的「静态网站托管」区块,复制提供的端点地址(注意不要带前缀的
http://) - 打开CloudFront控制台,进入对应分发的「源和源组」标签页,编辑当前关联S3的源配置
- 把原来的源域(格式一般为
<bucket>.s3.<region>.amazonaws.com)替换为上一步复制的S3静态网站托管端点,保存配置
2. 清理冗余配置(可选)
你之前按照SPA方案配置的404错误页跳转规则可以删除,当前静态导出的NextJS每个路径都有对应index.html,不需要客户端路由 fallback 逻辑。
3. 验证生效
等待CloudFront分发部署完成(一般5-10分钟),清除浏览器缓存后刷新页面测试即可。
额外安全优化建议(可选)
你当前将S3桶设为公开访问存在安全风险,建议:
- 关闭S3桶的公开访问配置
- 给CloudFront配置源访问控制(OAC),授予CloudFront单独访问S3桶的权限,避免S3内容被直接爬取或者攻击
内容的提问来源于stack exchange,提问作者Blueboye
相关产品推荐
相关产品推荐

