这是我在Stackoverflow上的第一篇文章,我试图寻找一个问题的答案,我目前在使用CloudFront提供静态S3网站页面,准确地说,是自定义的404错误页面。希望你能帮助我( :=))
我没有使用任何代码,只是使用AWS控制台作为POC。以下是场景:
a)我已经创建了两个buckets。名称是(例如):mybucket.com和www.mybucket.com。
b)我已经将我的静态站点(一个非常简单的站点)放在mybucket.com中,并将www.mybucket.com重定向到它。
c)内容存储桶(mybucket.com)具有index.html文件、图像文件。我在存储桶(名为error)下创建了一个文件夹,并在其中放置了一个名为404error.html的自定义错误消息文件。
d) index.html文件还调用一个简单的JavaScript代码,该代码从另一个存储桶(welcome.html)加载另一个文件(resource.mybucket.com)的内容。我已确保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)如果我使用website URL (mybucket.com.s3- S3 -.amazonaws.com)访问站点,并试图访问一个不存在的文件(比如myfile.html),它会正确地显示自定义的404错误页面。
当我尝试使用CloudFront发行版访问页面时,问题就出现了。我在S3存储桶(mybucket.com)上创建了一个CloudFront发行版,下面是我设置的属性:
a)错误页面:
i) HTTP错误代码:404-未找到
ii)缓存TTL时出错: 300
iii)自定义错误响应:是
iv)响应页面路径: /error/404error.html
v) HTTP响应码: OK
b)还设置了单独的缓存行为:
i)路径模式: /error/*
ii)限制观众访问:否
我把它保持得非常简单和标准。我没有转发cookie或查询字符串或使用任何签名的URL等。
一旦创建了发行版,当我尝试使用CloudFront URL访问站点时,主页工作正常。但是,如果我尝试使用一个不存在的页面进行测试,则不会收到我配置的自定义404错误页面。相反,我在浏览器(Chrome/FireFox -latest)中获得了以下XML文件:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>EB4CA7EC05512320</RequestId>
<HostId>some-really-big-alphanumeric-id</HostId>
</Error>
当我尝试从浏览器检查元素时,控制台中没有显示任何线索。
现在,我知道这个AccessDenied错误之前已经被报告和讨论过了,并且我已经尝试了大多数人建议的方法:完全访问存储桶。我已经确保(正如您从上面的存储桶策略中看到的,访问对任何人都是开放的)。我也尝试过确保源站访问ID已经被赋予了GetObject权限。我还删除并重新创建了CloudFront发行版,还删除/重新上传了error文件夹和该文件夹中的404error.html文件。可以从CloudFront网址手动访问该错误文件:
http://xxxxxxxx.cloudfront.net/error/404error.html
但是如果我试图访问一个任意不存在的文件,它就不起作用了:
http://xxxxxxxx.cloudfront.net/myfile.html
我是不是漏掉了什么?
我真的很感谢你的帮助。
问候
发布于 2016-09-16 05:49:12
以下是使您的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。当然,其他错误代码也是如此。
发布于 2019-06-13 03:41:18
2019年S3权限发生变化。如果你从2019年开始阅读这篇文章,你就不能遵循上面的任何建议!我做了一个教程,在Youtube上关注:
https://stackoverflow.com/questions/24184278
复制相似问题