Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 尝试通过我的网站上的完整url访问页面时接收访问被拒绝_Amazon Web Services_Amazon S3_Amazon Cloudfront_Access Denied - Fatal编程技术网

Amazon web services 尝试通过我的网站上的完整url访问页面时接收访问被拒绝

Amazon web services 尝试通过我的网站上的完整url访问页面时接收访问被拒绝,amazon-web-services,amazon-s3,amazon-cloudfront,access-denied,Amazon Web Services,Amazon S3,Amazon Cloudfront,Access Denied,有一段时间,我只是将我网站的内容存储在一个s3存储桶中,可以通过完整的url访问所有页面。我想通过添加SSL使我的网站更加安全,所以我创建了一个CloudFront发行版来指向我的s3 bucket 该站点将正常加载,但如果用户尝试刷新页面或尝试使用完整url(即www.example.com/home)访问页面,他们将收到拒绝访问的页面 我的s3存储桶上有一个策略,该策略将访问限制为仅对源访问标识和index.html设置为我的域根对象 我不明白我错过了什么 若要演示,请随时访问我的 您将注

有一段时间,我只是将我网站的内容存储在一个s3存储桶中,可以通过完整的url访问所有页面。我想通过添加SSL使我的网站更加安全,所以我创建了一个CloudFront发行版来指向我的s3 bucket

该站点将正常加载,但如果用户尝试刷新页面或尝试使用完整url(即www.example.com/home)访问页面,他们将收到拒绝访问的页面

我的s3存储桶上有一个策略,该策略将访问限制为仅对源访问标识和index.html设置为我的域根对象

我不明白我错过了什么

若要演示,请随时访问我的

您将注意到它如何将您重定向到kurtking.me/home。要重现错误,请尝试刷新页面或通过完整URL访问页面(即kurtking.me/life)


非常感谢您的帮助,因为几天来我一直在努力解决这个问题并寻找答案。

我已经找到了答案,并想发布我的解决方案,以防其他人遇到这个问题

这个问题是因为Angular是一个SPA(单页应用程序),而我使用S3存储桶来存储它。当您尝试通过url访问访问特定页面时,CloudFront将获取(例如,/about)并转到您的S3存储桶以查找该文件。因为Angular是SPA,所以从技术上讲,该文件不存在于S3存储桶中。这就是我出错的原因

我需要做些什么来修复它

如果您在Cloudfront中打开发行版,您将看到一个“错误页面”选项卡。我必须添加两个处理400和403的“自定义错误响应”。400和403的细节是一样的,所以我只包括一张400的照片。见下文:

基本上,发生的情况是,您告诉Cloudfront,不管发生400或403错误,都要重定向回index.html,从而让Angular控制是否可以转到路径。如果您希望向客户机提供400或403错误,则需要以角度定义这些路由

在设置了两个自定义错误响应之后,我部署了cloudfront解决方案和wallah,它成功了


我使用以下内容来帮助我找到这个解决方案。

解决这个问题的更好方法是允许列表存储桶权限,并为cloudfront添加404错误自定义规则,以指向index.html。403错误也由WAF返回,如果将它们添加到index.html以进行自定义错误处理,则会导致额外的安全问题。因此,对于angular应用程序,最好首先避免从S3中获得403个错误。

公认的答案似乎有效,但似乎不是一个好的做法。相反,检查cloudfront原点是否设置为S3 Bucket(静态文件在其中)实际的S3URL端点。它应该是s3url端点,而不是s3bucket

端点后的url应该是源


如果您在使用CDK时遇到此问题,则需要添加以下内容:

myapp.addCustomRule({
来源:“”,
目标:'/index.html',
状态:放大。重定向状态。重写
});

您是否向AWS提出了支持案例?假设您至少拥有或愿意注册开发人员支持()。如果不再需要,您可以在第一个月结束时取消支持选项。我已经探讨过该选项,但想看看社区中是否有其他人在这样做之前遇到过类似问题。您的页面正在从事某种SPA风格的猴子业务。当你点击/life或其他页面时,地址栏会发生变化,但没有HTTP请求获取/life——内容显然不是传统的网页加载,因此这就解释了为什么它在点击链接时有效,而在尝试直接加载其他“页面”时无效。。。似乎没有任何其他真实页面,因为所有内容都在JavaScript中。这从根本上说是一个角度问题,如何配置服务器端重定向来实现角度工作。我只对角度工作略知一二,但我确实写过,这可能与您的最终解决方案有关。+1-它没有准确回答我的问题,但它开始引导我走上正确的道路,更具体地使用诸如“SPA、s3/cloudfront问题”之类的关键词进行搜索。这最终导致我在我的解决方案的底部发布了一篇文章。也拯救了我的生命!干杯我在我的aws云前面板中没有看到这样的UI。我没有看到细微的错误。。。S3发布的是400而不是404。为了让它发布404,我允许
s3:ListBucket
权限。。。一个更快的修复,因为它将需要20多分钟来重新配置CF分发:)Life saver!非常感谢。很好的发现,我想:)您在这里提到的两个端点是S3网站端点和S3 REST API端点。您在这里提到的使用CloudFront的网站端点方法仍然要求您指定错误页面,在SPA的情况下,错误页面是
index.html
,否则完整URL将生成404。这与使用RESTAPI端点并拥有自定义错误页面非常相似,如接受的答案中所述。参考: