多源站AWS Cloudfront如何区分不同源返回的403、404错误并分别处理
解决方案
核心结论
Cloudfront 原生不支持全局维度按源站区分自定义错误页,你当前的问题来自全局自定义错误规则会拦截所有源站返回的403/404错误。不需要重构现有架构,调整Cloudfront配置即可解决问题。
最优调整方案(推荐)
目前Cloudfront已支持按单个缓存行为配置独立的自定义错误规则,操作步骤如下:
- 进入你的Cloudfront分发配置页,删除「自定义错误页」标签下全局生效的403、404错误规则
- 切换到「行为」标签页,编辑匹配默认路径
*、关联S3源站的缓存行为:- 下拉找到「自定义错误响应」板块,新增两条规则:
- 错误码选403,自定义响应码设为200,响应页路径填
/index.html,缓存TTL按你的需求设置即可 - 错误码选404,自定义响应码设为200,响应页路径填
/index.html
- 错误码选403,自定义响应码设为200,响应页路径填
- 保存该行为的配置
- 下拉找到「自定义错误响应」板块,新增两条规则:
- 确认匹配路径
/api/*、关联ELB源站的缓存行为,没有配置任何自定义错误响应规则(默认透传源站所有响应) - 保存整个分发配置,等待Cloudfront部署生效(通常5-15分钟)
配置完成后即可实现预期效果:
- 访问前端路径命中默认行为时,S3返回的403/404会被拦截为200返回index.html,由React Router处理路由
- 访问
/api/*前缀的接口时,后端返回的所有错误码都会直接透传给前端,不会被拦截修改
备选方案(兼容旧版Cloudfront分发)
如果你使用的是非常早期不支持行为级自定义错误配置的Cloudfront分发,可以通过调整S3侧配置实现同等效果:
- 删除Cloudfront全局的403、404自定义错误页规则
- 进入S3 Bucket的「静态网站托管」配置,添加自定义错误规则:
- 403、404错误均返回200状态码,响应对象为
/index.html
- 403、404错误均返回200状态码,响应对象为
- 确认Cloudfront关联的S3源站使用的是S3静态网站端点(格式为
bucket-name.s3-website-region.amazonaws.com),而非S3 REST API端点,否则S3的自定义错误规则不会生效
内容的提问来源于stack exchange,提问作者pantaphobic
相关产品推荐
相关产品推荐

