如何更改查看器响应 Cloudfront 事件中的状态代码?

Posted

技术标签:

【中文标题】如何更改查看器响应 Cloudfront 事件中的状态代码?【英文标题】:How can I change status code in viewer-response Cloudfront event? 【发布时间】:2019-04-13 05:01:41 【问题描述】:

我想使用 S3 对象元数据和数据库中的一些角色数据(或一些远程服务)来保护 Cloudfront 响应,具体用于当前用户。我想我应该在这里使用viewer-response 事件,以便同时访问 S3 数据和用户数据。我尝试在response 对象中设置statusstatusDescription,但它不适用于viewer-response 事件,适用于所有其他事件。设置标题仍然有效。

exports.handler = async (event) => 

  const response = event.Records[0].cf.response;
  const request = event.Records[0].cf.request;
  const isUserAllowed = await allowedByTokenAndDb(request);
  const isS3ObjectAllowed = response.headers['x-amz-meta-isSecure'][0].value === 'true';

  if (!isUserAllowed || !isS3ObjectAllowed) 
    response.status = '403'; // does not work
    response.statusDescription = 'Nothing';
  

  response.headers['X-Powered-By'] = [  // works, header will be added
    key: 'X-Powered-By',
    value: 'lol',
  ] 

  return response;

有没有办法让viewer-response 返回另一个状态? AWS 文档没有说明它是否可能。也许还有其他解决方案?

【问题讨论】:

它总是返回 200 Ok 而不是 403 吗? 403 可以在云端缓存,除非您覆盖它。 【参考方案1】:

根据文档,您似乎只能更改 viewer-requestorigin-requestorigin-response 事件处理程序中的响应。此页面没有明确声明您不能更改 viewer-response 事件处理程序中的响应,但它确实暗示了这一点,因为它只讨论了支持其他三个:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-updating-http-responses.html

和你一样,我也无法让它工作,但我最终使用 origin-response 来满足我的需求。

【讨论】:

【参考方案2】:

无法更改状态码、正文 和一组根据https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/edge-functions-restrictions.html的标题

具体来说,它说

查看器响应事件的边缘函数无法修改 HTTP 响应的状态码,不管响应是否到来 从源或 CloudFront 缓存。

【讨论】:

以上是关于如何更改查看器响应 Cloudfront 事件中的状态代码?的主要内容,如果未能解决你的问题,请参考以下文章

在CloudFront访问上触发RDS lambda

Xamarin Forms 渲染器未响应事件更改

请大家帮忙解决事件查看器中的ID29和17的问题!!!!!

您是否可以使用除Javascript以外的语言使用Lambda @ Edge修改AWS CloudFront事件的URI?

选择器更改事件未在 Titanium 中首次触发

怎么查看电脑开机记录?