为同一Cloudfront发行版的不同来源配置不同的错误页面

时间:2019-05-06 08:26:16

标签: amazon-s3 amazon-cloudfront

我们创建了一个有2个起点(1个s3起点和1个自定义起点)的云端分布。我们希望来自定制源的错误(5xx / 4xx)无需修改即可到达客户端/用户,但是s3中的错误页面由cloudfront错误页面配置提供。这可能吗 ?当前,Cloudfront不支持针对不同来源的不同自定义错误页面-如果任何一个来源返回错误,则Cloudfront将提供相同的错误页面。

2 个答案:

答案 0 :(得分:0)

您可以使用Lambda@Edge为您的来源自定义错误响应。

您需要将起源响应触发器与与您的起源相关的行为相关联。

CloudFront接收到来自原始的响应后,将触发原始响应:

enter image description here

通过这种方式,您可以添加标题,发出重定向,动态生成响应或更改HTTP状态代码。

根据您的用例,您可能必须针对两种来源进行自定义。

另请参阅Lambda@Edge now Allows you to Customize Error responses From Your Origin

答案 1 :(得分:0)

我通过切换S3存储桶以充当用作CloudFront自定义来源(即没有Origin Access Identity)的静态网站来解决了这个问题(并最终放弃了解决方案)。我使用aws:Referer存储桶策略将访问权限限制为仅访问通过CloudFront发出的请求。

注意Referer标头通常包含请求的URL。在这种情况下,您只是使用在CloudFront和S3之间共享的唯一秘密令牌来覆盖它。

on this AWS Knowledge center page在“使用网站终结点作为来源,访问受Referer标头限制”下进行了描述。

我最终使用了随机UUID作为令牌,并在CloudFront Origin配置中进行了设置。 cloudfront origin custom header configuration

使用相同的UUID,我最终得到了一个Bucket Policy,例如:

{
  "Id": "Policy1603604021476",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1603604014855",
      "Principal": "*",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": "arn:aws:s3:::example/*",
      "Condition": {
        "StringEquals": {
          "aws:Referer": "b4355bde-9c68-4410-83cf-058540d83491"
        }
      }
    },
    {
      "Sid": "Stmt1603604014855",
      "Principal": "*",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": "arn:aws:s3:::example",
      "Condition": {
        "StringEquals": {
          "aws:Referer": "b4355bde-9c68-4410-83cf-058540d83491"
        }
      }
    }
  ]
}

需要s3:ListBucket策略才能使404正常工作。如果没有,您将获得标准的S3 AccessDenied错误页面。

现在我的每个S3 Origins都可以具有在事物的S3端(而不是在CloudFront中)配置的不同的错误页面行为。

关注,出于以下原因,我不推荐这种方法:

  1. 不可能让S3在HTTPS上托管您的静态网站,因此您的Referer令牌将以明文形式发送。当然,这可能会在AWS网络上进行,但这仍然不是我想要的。
  2. 无论如何,每个S3存储桶只得到一个错误文档,因此对CloudFront行为的改进并不大。
相关问题