Amazon S3 重定向和 Cloudfront

Posted

技术标签:

【中文标题】Amazon S3 重定向和 Cloudfront【英文标题】:Amazon S3 Redirect and Cloudfront 【发布时间】:2014-05-09 12:33:56 【问题描述】:

我正在尝试使用对象在 S3 上设置 301 重定向,此处引用 http://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html。我一直有一些问题,似乎无法弄清楚我做错了什么。

我得到的是一个空白页面(0 字节文件),好像没有设置“网站重定向位置”元数据值。

我做错了什么?

另外,这是否适用于 AWS CloudFront?


我的 S3 控制台设置

注意几点:

我有这个用于托管静态网站的设置。 我正在使用 ssl/https 上传自己的证书并在云端分发中设置。 除重定向对象外,所有页面似乎都可以工作。 我尝试设置路由规则,但它们似乎在 Cloudfront 中不起作用。

我正在尝试通过 cloudfront url 和 s3 url (https://s3.amazonaws.com/bucket/users/sign_in) 访问重定向

【问题讨论】:

【参考方案1】:

对于 S3 中类似网站的功能,例如重定向、html 错误消息和索引文档,您不能使用 REST 端点($bucket_name.s3.amazonaws.com$bucket_name.s3.$region.amazonaws.com),因为这些功能仅由 Web 提供站点端点 ($bucket_name.s3-website.$region.amazonaws.com)。

http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html

要使行为在 Cloudfront 中可用,您还需要将 Cloudfront 配置为使用此端点,而不是通过控制台中的自动完成提供的 REST 端点。

输入您的存储桶的 Amazon S3 静态网站托管终端节点。此值显示在 Amazon S3 控制台的 Properties 页面上的 Static Website Hosting 下。

当您以这种格式指定存储桶名称时,您可以使用 Amazon S3 重定向和 Amazon S3 自定义错误文档。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DownloadDistS3AndCustomOrigins.html

请注意,Web 端点不支持 HTTPS,但您可以将 Cloudfront 配置为使用 HTTP 从存储桶中获取,即使客户端连接是 HTTPS。


有用的提示:在使用 CloudFront 对更改进行故障排除和测试时,用户经常对您进行更改和 CloudFront 开始呈现新行为之间的明显“延迟”感到困惑。在错误页面的情况下,CloudFront 有一个默认的 5 分钟 错误缓存最小 TTL 防止它重新向源发送失败页面的请求,这是一个将计时器与缓存行为中设置的最小/默认/最大 TTL 分开。特别是在测试时,您可能希望禁用这些计时器,并使用我在回答有关明显Amazon CloudFront Latency 的问题中提供的步骤对返回错误的页面的每个后续请求强制重试。

【讨论】:

您是否为您的原始协议策略配置了匹配查看器? s3 网站端点不支持 https。您需要将其设置为 http。 docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/… 谢谢!经过几天试图弄清楚为什么我无法让它工作后,我终于在这里找到了正确的问题和答案:) 这件事让我困扰了很久。确保在设置 Origins 时不要包含 S3OriginConfig 参数,而是使用 CustomOriginConfig。似乎很明显,但让我抓狂了一段时间:) 另外需要注意的是,如果您使用 CloudFront OAI(原始访问身份)来限制对 S3 存储桶的直接访问,它将不再起作用。另一种选择(尽管可以绕过)是创建和转发自定义标头,并具有检查它的存储桶策略。例如abridge2devnull.com/posts/2018/01/… @KJH 是的,OAI 不起作用,因为网站托管功能仅用于publicly-readable content。调整 S3 允许通过策略评估的少数标头之一是当内容只需要“安全”到足以将诚实的人拒之门外时有用的事情之一。我考虑过创建一个 Lambda@Edge 库来模拟 Web 端点功能,这样就可以避免这一切,但还没有找到足够有力的案例。【参考方案2】:

我在重定向失败和下载零长度文件时遇到了同样的问题,但没有使用 Cloudfront。

在我的情况下,根本原因是我的 DNS CNAME 记录指向 REST 端点 (static.righto.com.s3-us-west-2.amazonaws.com) 而不是网站端点 (static.righto.com. s3-网站-us-west-2.amazonaws.com)。更新 CNAME 记录修复了我的重定向。

此问题的另一个症状是缺少显示 XML 错误页面而不是 HTML 错误页面的页面。

This document 解释了网站端点和 REST 端点之间的区别。

【讨论】:

【参考方案3】:

如果您在不使用 CloudFront 的情况下来这里寻找解决方案,这里是:

您可以使用 s3cmd(当然是在 bash 脚本中)及其参数:

--add-headerx-amz-website-redirect-location

例如,这个脚本解决了页面/about/的问题:

s3cmd \
--acl-public \
--add-header "x-amz-website-redirect-location: /about/" \
--no-preserve \
put "./path/to/any/small/file/at/your/local/drive/index.html" "s3://domain.com/about"

此脚本使用 new 文件名复制 一些 现有文件,不带斜杠。文件包含什么并不重要,因为浏览器会立即被重定向。

当您(以及更重要的网络爬虫)尝试打开页面/about 时,您会得到301 重定向到/about/。 这允许保留 正确的页面在 google、yandex 和其他搜索引擎的缓存中

您可以在多个页面上重复此代码。 或者您可以添加搜索文件夹的功能并为每个文件夹拨打电话。可能你会很乐意在这里展示它:)

【讨论】:

这也适用于 CloudFront,只需要公开存储桶以便 CF 可以连接。

以上是关于Amazon S3 重定向和 Cloudfront的主要内容,如果未能解决你的问题,请参考以下文章

cloudfront 和 s3 301 重定向显示存储桶的裸域

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

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

AWS CloudFront 重定向到 S3 存储桶

我需要使用 cloudfront 和 s3 重定向我的 url

如何使用 Heroku / Amazon cloudfront / route 53 重定向