这是我在Stackoverflow中的第一篇文章,我试图搜索我目前正在使用CloudFront提供静态S3网站页面的问题的答案,准确地说,是自定义404错误页面。希望你能帮助我:=))
我没有使用任何代码,只是将AWS控制台用作POC。这是场景:
a)我创建了两个桶。名称(例如):mybucket.com和www.mybucket.com。
b)我已将我的静态网站(一个非常简单的网站)放在mybucket.com内,并将www.mybucket.com重定向到它。
c)内容存储桶(mybucket.com)有一个index.html文件,一个图像文件。我在存储桶下创建了一个文件夹(称为错误),并在其中放置了一个名为404error.html的自定义错误消息文件。
d)index.html文件还调用一个简单的JavaScript代码,该代码从另一个存储桶(resource.mybucket.com)加载另一个文件(welcome.html)的内容。我确保为CORS启用了存储桶,它正在运行。
d)存储桶具有存储桶策略,允许每个人访问存储桶及其内容。桶状态如下所示:
{
"Id": "Policy1402570669260",
"Statement": [
{
"Sid": "Stmt1402570667997",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::mybucket.com/*",
"Principal": {
"AWS": [
"*"
]
}
}
]
}
e)我确保www.mybucket.com和resource.mybucket.com也有相同的政策。
f)mybucket.com已配置为静态网站托管,mybucket.com的错误文件已配置为error / 404error.html。
c)如果我使用S3 URL(mybucket.com.s3-website-.amazonaws.com)访问该站点,并尝试访问不存在的文件(例如myfile.html),它会正确显示自定义404错误页面。
当我尝试使用CloudFront分配访问该页面时出现问题。我在S3存储桶(mybucket.com)上创建了一个CloudFront分配,这是我设置的属性:
a)错误页面:
i)HTTP错误代码:404-Not Found
ii)错误缓存TTL:300
iii)自定义错误响应:是
iv)响应页面路径:/error/404error.html
v)HTTP响应代码:好的
b)还设置了单独的缓存行为:
i)路径模式:/ error / *
ii)限制查看者访问权限:否
我保持非常简单和标准。我不转发cookie或查询字符串或使用任何签名的URL等。
创建分发后,当我尝试使用CloudFront URL访问该网站时,主页面正常工作。但是,如果我尝试使用不存在的页面进行测试,则不会使用我配置的自定义404错误页面。相反,我在浏览器中获取以下XML文件(Chrome / FireFox -latest):
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>EB4CA7EC05512320</RequestId>
<HostId>some-really-big-alphanumeric-id</HostId>
</Error>
当我尝试从浏览器中检查元素时,控制台中没有显示任何线索。
现在我知道此AccessDenied错误已经报告过并且已经讨论过了,我已经尝试了大多数建议:提供对存储桶的完全访问权限。我确保了(从上面的存储桶政策中可以看出,任何人都可以访问)。我还试图确保Origin Access ID已获得GetObject权限。我还删除并重新创建了CloudFront分发版,并删除/重新上传了文件夹中的错误文件夹和404error.html文件。可以从CloudFront URL手动访问错误文件:
http://xxxxxxxx.cloudfront.net/error/404error.html
但是如果我尝试访问任意不存在的文件,它就不起作用了:
http://xxxxxxxx.cloudfront.net/myfile.html
我在这里缺少什么?
我非常感谢你的帮助。
此致
答案 0 :(得分:7)
如果您快速设置了一个存储分区(the-bucket
),则可以对其设置List
Everyone
404
。这将阻止CloudFront正确确定资产是否为<URL>/non-existent.html
。
您的上传工具可能正在上传并具有每个对象的读取权限 - 因此您不会注意到此权限的缺失。
因此,如果您请求http://the-bucket.s3.amazonaws.com/non-existent.html
,CloudFront会尝试读取广告资源,例如404
200
,CloudFront可以将请求重新映射为404
或自定义403
403
,CloudFront会将{{1}}返回给最终用户(这是您在日志中看到的内容)。这很有道理,但很混乱!
答案 1 :(得分:6)
以下是使您的S3存储桶使用CloudFront自定义错误页面的基本策略。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::<yourBucket>",
"Principal": "*"
},
{
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::<yourBucket>/*",
"Principal": "*"
}
]
}
正如Ben W已经指出的那样,诀窍是授予ListBucket
权限。如果没有它,您将收到拒绝访问错误。
还可能值得一提的是,如果您从另一个桶中提供服务而不是您网站所在的存储桶,那么5xx错误才有意义。 此外,404错误应该响应404错误代码,即使在您的自定义错误页面上,也不会突然变成代码200.当然,其他错误代码也是如此。
答案 2 :(得分:1)
我从http://blog.celingest.com/en/2013/12/12/cloudfront-configuring-custom-error-pages/获得了这些提示,您的问题也可能与https://serverfault.com/questions/642511/how-to-store-a-cloudfront-custom-error-page-in-s3/
有关答案 3 :(得分:0)
S3权限在2019年发生了变化。如果您自2019年以来一直在阅读此内容,那么您将无法遵循上述任何建议!我在YouTube上制作了一个教程来关注: