CloudFront是否会删除Lambda@Edge添加的Server-Timing请求头?
问题原因
CloudFront启用安全请求头策略中的Server-Timing选项时,在缓存命中场景下会覆盖Lambda@Edge添加的自定义Server-Timing值。尽管Viewer Response触发器本应在缓存命中时重新执行并添加头,但安全策略的后置处理会强制替换该头内容,导致自定义值丢失。
解决方案
1. 禁用CloudFront安全请求头策略的Server-Timing选项
完全通过Lambda@Edge控制Server-Timing头的生成,避免CloudFront在后续流程中覆盖自定义内容。
2. 调整Lambda@Edge脚本(按需保留CloudFront原生指标)
如果需要同时包含CloudFront原生的Server-Timing指标和自定义内容,修改脚本合并两者,避免直接覆盖:
export async function viewerResponse(event) { const { response } = event.Records[0].cf; // 读取已有Server-Timing值(如CloudFront自动生成的) const existingTiming = response.headers['server-timing']?.[0]?.value || ''; // 自定义计时内容 const customTiming = 'something'; // 合并值,用逗号分隔多指标 const finalTiming = existingTiming ? `${existingTiming}, ${customTiming}` : customTiming; response.headers['server-timing'] = [{ key: 'Server-Timing', value: finalTiming }]; return response; }
3. 可选:配置缓存策略保留Server-Timing头
若自定义Server-Timing值不依赖请求参数,可在CloudFront缓存策略的缓存的响应头列表中添加Server-Timing,让CloudFront缓存该头内容,减少Lambda重复计算的开销。
验证步骤
- 重新部署修改后的Lambda@Edge并关联到CloudFront的Viewer Response触发器
- 关闭安全请求头策略中的Server-Timing开关
- 触发缓存命中请求(通过
X-Cache: hit by cloudfront确认),检查响应头是否包含自定义的Server-Timing值
内容的提问来源于stack exchange,提问作者Seth Jeffery
相关产品推荐
相关产品推荐

