3

我有一个自定义来源的 Cloudfront 发行版。

我想使用 Lambda@Edge 原始请求来修改和添加一些额外的标头以转发到我的原始服务器。

下面是我的 Lambda 函数。这custom_header在我的 Lambda 的 Cloudwatch 日志中可见,但未显示在我的自定义服务器请求标头中:(。

exports.handler = (event, context, callback) => {
  const request = event.Records[0].cf.request;
  const headers = request.headers;

  headers['custom_header'] = [{ key: 'custom_header', value: 'custom_header' }];

  return callback(null, request);
}

我希望custom_header在我的 Node.js 路由中可见req.headers

4

2 回答 2

6

自定义标头可以通过以下结构传递。

request.origin.custom.customHeaders

参考:https ://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-structure.html#lambda-event-structure-request

因此,代码应如下所示。

exports.handler = (event, context, callback) => {
  const request = event.Records[0].cf.request;
  const headers = request.headers;

  request.origin.custom.customHeaders['custom_header'] = [{ key: 'custom_header', value: 'custom_header' }];

  return callback(null, request);
}
于 2019-03-02T20:38:38.560 回答
0

您的问题可能是您使用的是“Origin Request”而不是“Viewer Request”触发器。

让我们看看这篇关于“我应该使用哪个触发器?”的 AWS 文档文章。

您是否希望该函数针对每个请求执行?
如果您希望函数针对CloudFront 收到的每个分配请求执行,请使用查看器请求或查看器响应事件仅当请求的对象未缓存在边缘站点并且 CloudFront 将请求转发到源时,才会发生请求和响应事件。

我刚刚解决了一个与您类似的问题 - 只是我正在尝试使用 Origin Response 触发器。我在我的 S3 上设置了缓存(使用 --max-age 上传到 S3 的项目),然后我使用 S3 托管了一个静态站点,并在顶部使用了 CloudFront。

我假设由于我的 S3 项目被缓存,所以原始请求触发器没有触发,因为正如 AWS 文章所说 - 原始请求/响应触发器仅在缓存未命中时触发。

一旦我切换到查看器响应,就可以了。

我正在关注教程,即使是 lambda 触发器设置的屏幕截图也有“原始响应”,这误导了我。

于 2021-09-20T15:25:43.557 回答