CloudFront viewer-response事件修改响应头报只读头删除错误怎么解决?
错误原因
Lambda@Edge 针对viewer-response触发事件设定了只读响应头规则,Content-Length、Content-Encoding均属于不可删除、不可修改的只读头范畴。
你当前的代码直接构造了全新的headers对象,完全覆盖了原始响应中自带的只读头,CloudFront做结果校验时会判定你主动删除了只读头,因此抛出上述报错。
修复方案
不要直接创建全新的响应对象,而是在原始响应的基础上修改你需要自定义的字段,保留原有只读头即可。修改后的参考代码如下:
// 从事件中取出原始响应 const response = event.Records[0].cf.response; // 修改状态码和描述 response.status = '302'; response.statusDescription = 'Found'; // 新增自定义头,原有头会被保留 response.headers['location'] = [{ key: 'location', value: 'https://abc.test.io' }]; response.headers['set-cookie'] = [{ key: 'set-cookie', value: 'sessiontoken=' + sessionObjectData.session.sessionId + '; Secure; HttpOnly' }]; callback(null, response);
补充说明
- 如果你确实需要修改
Content-Length、Content-Encoding这类头,需要将Lambda触发事件从viewer-response更换为origin-response,该触发场景下这类头允许修改。 - 所有自定义的响应头key必须使用全小写格式,符合CloudFront的头字段规范,避免触发其他校验错误。
内容的提问来源于stack exchange,提问作者af_khan
相关产品推荐
相关产品推荐

