AWS Cloudfront重定向到S3存储桶

Raj*_*esh 21 amazon-s3 amazon-web-services amazon-cloudfront amazon-route53

我创建了一个用于静态网站的cloudfront发行版.S3是原始服务器.现在,如果我们访问cloudfront url,它会重定向到S3位置.

d2s18t7gwlicql.cloudfront.net或test.telekha.in

在浏览器中显示 https://telekha-test-www.s3.ap-south-1.amazonaws.com/index.html#/dashboard

我期待https://test.telekha.in/#/dashboard

如果我通过curl 访问https://test.telekha.in,它将返回我的index.html文档

如果我通过curl 访问http://test.telekha.in它会返回

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>CloudFront</center>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

但在浏览器中,http和https都重定向到https://telekha-test-www.s3.ap-south-1.amazonaws.com/index.html#/

请让我知道如何解决此问题.

Sla*_* II 108

快速解决方案

使用 S3 存储桶的区域域名来配置 CloudFront 分配的来源,例如:{bucket-name}.s3.{region}.amazonaws.com.


解释

根据 AWS 开发人员论坛上的讨论:Cloudfront 域重定向到 S3 源 URL,为新创建的 S3 存储桶创建和传播 DNS 记录需要时间。对于在美国东部(弗吉尼亚北部)区域创建的存储桶,此问题不可见,因为该区域是默认区域(后备)。

每个 S3 存储桶有两个域名,一个是全局的,一个是区域的,即:

  • 全球——{bucket-name}.s3.amazonaws.com
  • 区域{bucket-name}.s3.{region}.amazonaws.com

如果您将 CloudFront 分配配置为使用全局域名,您可能会遇到此问题,因为 DNS 配置需要时间。

但是,您可以首先在源配置中使用区域域名来避免此 DNS 问题。


CloudFormation 模板

如果您使用的是 CloudFormation,则可以使用资源的RegionalDomainName输出属性AWS::S3::Bucket

S3Bucket:
  Type: AWS::S3::Bucket

CloudFrontDistribution:
  Type: AWS::CloudFront::Distribution
  Properties:
    DistributionConfig:
      Origins:
        - DomainName: !GetAtt S3Bucket.RegionalDomainName
Run Code Online (Sandbox Code Playgroud)

更多信息

同样,我强烈建议阅读这篇关于 S3 不同路径格式未来的博客文章:

  • 我花了很长时间查看我的政策并摸不着头脑,重新启动分发等,但只需将其更改为我的存储桶所在的区域(伦敦)即可立即解决它。谢谢你! (2认同)

Raj*_*esh 21

我发现了这个问题.它采用云端配置. 这个博客帮助了我.

在定义原点时我直接选择了S3桶.我们应该进入S3存储桶的域名,如telekha-test-www.s3-website.ap-south-1.amazonaws.com

  • 使用S3 URL配置源将使用S3和CF URL使内容可用,这可能是不合需要的. (11认同)

Sim*_*son 21

首先要检查你是否认为你看到这个是运行下面的curl命令.如果它返回HTTP/1.1 307 Temporary Redirect,那么您将看到此问题.

$ curl -I https://YOUR_CF_DOMAINNAME.cloudfront.net/

HTTP/1.1 307 Temporary Redirect
Content-Type: application/xml
Content-Length: 0
Connection: keep-alive
x-amz-bucket-region: ap-southeast-2
Location: http://yourS3bucketname.s3-ap-southeast-2.amazonaws.com/
Date: Wed, 12 Jul 2017 00:20:27 GMT
Server: AmazonS3
Age: 1775
X-Cache: Hit from cloudfront
Via: 1.1 someid.cloudfront.net (CloudFront)
X-Amz-Cf-Id: someguid==
Run Code Online (Sandbox Code Playgroud)

我发现这个问题的最佳描述是:

S3更新全局REST端点层次结构*.s3.amazonaws.com的DNS,并在创建存储桶后的短时间内向存储区的右侧区域发送请求,并且CloudFront似乎依赖于此将请求发送到右侧地点.在初始更新完成之前,S3将返回重定向,CloudFront将该重定向返回给浏览器.~ michael-sqlbot

鉴于此问题实际上是由于在S3中配置存储桶时发生的S3存储桶名称的内部DNS传播(不是100%清除,但似乎非常可能),那么应该可以通过配置来避免此问题在配置Cloudfront发行版之前,在S3中的公共网站,并且根据doco,将S3公共Web名称配置为云端源而不是s3桶名.

作为参考,我将S3存储桶名称和S3网站名称配置为Cloudfront起源,我可以说它们都可以工作!(最终?)

参考文献:

  • 如果您正在托管资产,临时修复是暂时公开存储桶,这样重定向的文件实际上会被提供。这个问题对我来说持续了不到 3 小时(现在是 200 OK)。 (2认同)

Kir*_*ril 8

事实证明,这只是一个计时问题,如果一切配置正确,则过一会儿便会自行修复。可以在 AWS论坛线程中找到更多信息。

当前在此处接受的答案以及链接的博客文章建议为您的S3存储桶启用静态网站,然后更改CF源以指向该静态网站。该解决方案确实解决了重定向问题,但具有的副作用是,现在既可以使用CF URL或自定义CNAME以及使用S3 URL来访问网站。