AWS CloudFront 重定向到 S3 存储桶

Posted

技术标签:

【中文标题】AWS CloudFront 重定向到 S3 存储桶【英文标题】:AWS CloudFront redirecting to S3 bucket 【发布时间】:2016-12-08 16:27:48 【问题描述】:

我创建了一个 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>

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

请告诉我如何解决此问题。

【问题讨论】:

【参考方案1】:

快速解决方案

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


说明

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

每个S3 bucket有两个域名,一个全局,一个区域,即:

全球bucket-name.s3.amazonaws.com 地区bucket-name.s3.region.amazonaws.com

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

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


CloudFormation 模板

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

S3Bucket:
  Type: AWS::S3::Bucket

CloudFrontDistribution:
  Type: AWS::CloudFront::Distribution
  Properties:
    DistributionConfig:
      Origins:
        - DomainName: !GetAtt S3Bucket.RegionalDomainName

更多信息

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

Amazon S3 Path Deprecation Plan – The Rest of the Story

【讨论】:

这帮助了我!谢谢! 我花了很长时间查看我的政策并摸不着头脑,重新启动分发等,但只是将其更改为我的存储桶所在的区域(伦敦)立即解决了它。谢谢! 你拯救了我的一天!【参考方案2】:

我发现了问题。它具有云端配置。 This 博客帮助了我。

在定义来源时,我直接选择了 S3 存储桶。我们应该输入 S3 存储桶的域,例如 telekha-test-www.s3-website.ap-south-1.amazonaws.com

【讨论】:

使用 S3 URL 配置源将使内容可以同时使用 S3 和 CF URL,这可能是不受欢迎的。 虽然这可能会解决原始问题,但使用 S3 REST API 端点(而不是 S3 网站端点)是一个有效的选择(每个都有其权衡:docs.aws.amazon.com/AmazonS3/latest/userguide/…)【参考方案3】:

首先要检查你是否认为你看到了这个是运行下面的 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==

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

S3 更新全球 REST 终端节点层次结构 *.s3.amazonaws.com 的 DNS,其中记录了在创建存储桶后的短时间内向存储桶的正确区域发送请求的记录,CloudFront 似乎依赖于此发送请求到正确的地方。在初始更新完成之前,S3 将返回一个重定向,而 CloudFront 将该重定向返回到浏览器。 ~michael-sqlbot

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

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

参考资料:

AWS official setup guide AWS Forum topic

【讨论】:

临时修复,如果您托管资产,是让存储桶暂时公开,这样重定向的文件就会被实际提供。这个问题对我来说持续了不到 3 个小时(现在它是 200 OK)。 @AndyHayden 我也确实发生了什么事,等了大约 3 个小时,问题才自行解决。感谢您的提示。应该是实际的答案。 如果您正在寻找临时修复,请从 CF 原始 URL 中删除本地区域。例如。将 CF 原点设置为 yourS3bucketname.s3.amazonaws.com【参考方案4】:

事实证明,这只是一个时间问题,如果一切配置正确,它会在一段时间后自行修复。更多信息可以在thisAWS 论坛帖子中找到。

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

【讨论】:

我注意到当我将源切换到静态站点而不是存储桶 URL 时,此问题已得到解决。 我放弃了,给自己泡了杯咖啡,然后又回来了,很快。是的,时间,没有考虑传播时间。【参考方案5】:

为了扩展已接受的答案,参考博客文章末尾的这部分特别有帮助:

几天前我发现了一个微妙的“错误”:当使用类似的 URL 时 www.example.com/about/,Amazon S3 实际上会返回“index.html” 文件夹内的文件(因为它被配置为静态网站 桶)。

有趣的是,如果你省略了斜杠 (www.example.com/about),S3 将首先检查一个对象是否调用 “约”存在。如果不是,它会认为 about 是一个 文件夹,并将发出 301 重定向到 about/.使用时 CloudFront,这意味着 CloudFront 实际上会缓存…… 重定向而不是文件本身! 因此,您必须确保 您的所有 URL 都以斜杠结尾以避免无用 重定向。

【讨论】:

以上是关于AWS CloudFront 重定向到 S3 存储桶的主要内容,如果未能解决你的问题,请参考以下文章

AWS CloudFront 重定向到路径

使用 CloudFront 和目录重定向的 AWS S3 静态网站托管

如何在 AWS S3 网站 CloudFront 中设置别名重定向?

AWS Cloudfront重定向TOO_MANY次

javascript 使用AWS Lambda重定向到CloudFront上的尾部斜杠。 (所有这一切都因为S3使用302重定向而不是301)

AWS CloudFront 和 S3,使用单一重定向处理 WWW 和 HTTPS