使用CloudFront Functions重定向请求时如何保留HTTP请求体?
问题结论
- 你当前的需求无法通过CloudFront Functions实现,如果要保留POST请求体完成路径转发,优先推荐使用Lambda@Edge,甚至可以不用编写函数直接调整CloudFront行为配置解决。
1. CloudFront Functions无法实现的核心原因
CloudFront Functions的设计定位是轻量、低延迟的请求/响应元数据处理,原生不支持读取、修改HTTP请求体,无论你如何调整重定向逻辑,都无法在函数层操作请求体内容。
同时你当前使用的302状态码本身不符合保留请求体的重定向要求:HTTP标准中,绝大多数客户端遇到POST请求返回302时,会自动将重定向后的请求改为GET方法,同时丢弃原有请求体。如果要让客户端保留原请求方法和请求体重定向,需要返回307(临时重定向)或308(永久重定向)状态码,但这类重定向本质还是需要客户端发起两次请求,效率远低于服务端直接转发。
2. Lambda@Edge的实现方案
你完全不需要走重定向逻辑,直接通过Lambda@Edge的**源请求(Origin Request)**触发事件改写请求配置即可,整个转发过程在CloudFront服务端完成,客户端无感知,不会丢失请求体:
- 在Lambda@Edge函数中直接将请求的源站地址修改为
api.my.domain,同时将请求的Host头改写为api.my.domain,直接转发请求到API Gateway即可,不需要返回重定向响应。 - 你之前直接配置
/api行为返回403大概率就是Host头不匹配导致的:API Gateway默认校验请求的Host头必须和绑定的自定义域名一致,默认配置下CloudFront转发请求到源站时会带上原请求的Host头my.domain,API Gateway无法识别自然返回403。
3. 更简化的无函数方案
你甚至不需要编写任何函数,直接调整CloudFront的源站配置即可解决403问题:
- 找到你绑定API Gateway的源站配置,在源站自定义请求头中添加
Host头,值设置为api.my.domain,CloudFront转发请求到API Gateway时会自动用这个自定义Host头覆盖原请求的Host头,无需额外代码即可正常转发所有请求(包括带请求体的POST请求)。
内容的提问来源于stack exchange,提问作者Logan Shire
相关产品推荐
相关产品推荐

