自定义域名下CloudFront静态资源返回301,期望获取200状态码
问题核心根因
从你提供的响应头信息可以直接定位两个连锁触发点:
x-cache显示CloudFront命中,说明当前返回的301是已经被固化在边缘节点缓存里的旧响应,不是实时回源生成的- 301的Location头指向
https://www.example.com的资源地址,同时Server头标识后端为Apache,说明这个301最初是源站的强制跳转规则生成的,被CloudFront缓存后持续对外返回
分步解决操作
1. 优先清理已被缓存的错误301响应
CloudFront默认会缓存301类重定向响应,不先清理缓存的话,后续修改配置不会生效:
- 进入对应CloudFront分发的控制台配置页,打开「失效」标签栏
- 输入出问题的资源路径前缀(比如
/vendor/bootstrap/css/*)提交失效请求,等失效状态完成后再测试资源加载
注意:仅失效出问题的路径即可,不要提交全路径/*的失效请求,避免不必要的缓存重建损耗
2. 修正源站Apache的跳转规则,切断301触发源
源站的重定向规则是301的最初来源,需要匹配CloudFront的回源配置调整规则:
- 先确认CloudFront的回源Host头配置:进入分发配置的「源站」标签页,查看对应源站的「源站请求策略」中,Host头是否设置为回源使用的原始域名。如果是这种情况,Apache会默认触发本身绑定的非www转www的站点跳转规则,导致回源请求被301拦截
- 两种调整方案二选一即可:
- 把CloudFront回源的Host头修改为
www.example.com,这样回源时Apache收到的Host头完全匹配站点配置,不会触发跳转 - 在Apache的站点配置中增加判断逻辑:当请求Host为CloudFront回源使用的原始域名时,跳过所有强制域名跳转、HTTP转HTTPS的规则
- 把CloudFront回源的Host头修改为
- 额外检查回源协议配置:如果CloudFront当前用HTTP协议回源到Apache,而Apache配置了强制HTTP跳转HTTPS的规则,也会直接返回301。这种情况要么把CloudFront的回源协议改为「仅HTTPS」,要么在Apache规则中对回源请求跳过HTTP转HTTPS的校验。
3. 调整CloudFront缓存策略,避免同类问题复发
- 进入分发配置的「行为」标签页,编辑对应资源路径的缓存策略
- 调低301、302类重定向响应的默认缓存TTL,可直接设置为不缓存这类重定向响应,避免后续源站出现临时配置错误时,错误的301被长期缓存
- 如果你本来就希望用CloudFront的默认域名对外提供静态资源服务,需要彻底移除源站的强制域名跳转规则,否则后续缓存过期回源时,仍会拿到301响应
内容的提问来源于stack exchange,提问作者The Fair Technology
相关产品推荐
相关产品推荐

