CloudFront+Elastic Beanstalk单实例环境部分API返回403/500求助
问题排查与解决方案
环境配置
- Spring Boot后端部署在Elastic Beanstalk单实例环境(无负载均衡,仅支持HTTP协议),本身运行正常
- CloudFront分发以该Elastic Beanstalk实例为源站,源站协议仅配置HTTP;已添加带有效SSL证书的自定义备用域名
核心问题
登录接口POST请求可正常返回结果,但后续带认证头的请求均返回500或403错误,响应头均包含x-cache: Error from cloudfront
排查线索
- 清除CloudFront缓存后,通过Swagger内嵌的CloudFront URL测试所有接口,全部正常
- 使用自定义域名访问时,仅登录接口可用
- 再次直接用CloudFront URL访问,仅登录接口正常,带认证头的请求失效
可能的原因及解决方法
1. CloudFront缓存策略与认证头冲突
CloudFront可能缓存了未携带认证头的请求状态,当后续带认证头的请求到达时,缓存的无认证状态导致权限验证失败。
- 解决方法:
- 调整CloudFront行为配置,将认证相关请求头(如
Authorization)添加到缓存键排除列表,确保不同认证头的请求不会被统一缓存 - 对需要认证的接口设置缓存策略为不缓存(TTL设为0),强制请求直达源站
- 调整CloudFront行为配置,将认证相关请求头(如
2. CloudFront自定义域名HTTPS配置问题
自定义域名使用HTTPS但源站仅支持HTTP,协议转换过程中可能丢失或篡改认证头。
- 解决方法:
- 检查CloudFront行为的查看器协议策略,建议设置为
Redirect HTTP to HTTPS - 确认源站协议策略设为
HTTP only,确保CloudFront与源站通信协议正确,避免头信息被意外修改
- 检查CloudFront行为的查看器协议策略,建议设置为
3. Elastic Beanstalk会话/认证状态传递问题
源站本身正常,但CloudFront代理可能导致会话标识(如Cookie)无法正确传递或被缓存。
- 解决方法:
- 检查Spring Boot会话配置,确保会话Cookie的
Secure、HttpOnly属性设置正确(HTTPS访问时Secure需设为true) - 在CloudFront行为中,将会话相关Cookie添加到白名单,确保其能正确转发到源站
- 检查Spring Boot会话配置,确保会话Cookie的
4. CloudFront WAF规则拦截
WAF规则可能错误拦截了带认证头的请求。
- 解决方法:
- 检查CloudFront关联的WAF规则,排查是否有规则匹配到认证头格式(如特殊字符、长度限制)
- 临时禁用WAF测试,确认是否为WAF导致的拦截
内容的提问来源于stack exchange,提问作者Nisha
相关产品推荐
相关产品推荐

