我们创建了一个有2个起点(1个s3起点和1个自定义起点)的云端分布。我们希望来自定制源的错误(5xx / 4xx)无需修改即可到达客户端/用户,但是s3中的错误页面由cloudfront错误页面配置提供。这可能吗 ?当前,Cloudfront不支持针对不同来源的不同自定义错误页面-如果任何一个来源返回错误,则Cloudfront将提供相同的错误页面。
答案 0 :(得分:0)
您可以使用Lambda@Edge为您的来源自定义错误响应。
您需要将起源响应触发器与与您的起源相关的行为相关联。
CloudFront接收到来自原始的响应后,将触发原始响应:
通过这种方式,您可以添加标题,发出重定向,动态生成响应或更改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配置中进行了设置。
使用相同的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中)配置的不同的错误页面行为。
关注,出于以下原因,我不推荐这种方法: