Amazon S3重定向和Cloudfront

82
我正在尝试使用对象在S3上设置301重定向,参考了这里的文档http://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html。但我遇到了一些问题,似乎无法确定我的错误所在。
我看到的是一个空白页面(0字节文件),就好像没有设置“网站重定向位置”元数据值一样。 我错在哪了? 此外,这在AWS CloudFront上可行吗?
我的S3控制台设置如下: S3 Console Setup 需要注意的几个事项: 我已经为托管静态站点进行了设置。 我正在使用上传并在Cloudfront分发中设置的自己的证书来使用ssl / https。 除了重定向对象之外,所有页面都似乎正常工作。 我已经尝试设置路由规则,但它们似乎在Cloudfront中不起作用。 我试图通过cloudfront url和s3 url(https://s3.amazonaws.com/{bucket}/users/sign_in)访问重定向。
4个回答

174

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

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

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

输入您的存储桶的Amazon S3静态网站托管端点。此值在Amazon S3控制台上出现,在 属性 页下的 静态网站托管 中。

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

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

请注意,网站端点不支持HTTPS,但是您可以配置Cloudfront从桶中获取HTTP即使客户端连接是HTTPS。


提示:在使用CloudFront进行故障排除和测试时,用户经常会被制造变更和CloudFront开始表现新行为之间的明显“延迟”所困扰。对于错误页面,CloudFront具有默认的5分钟Error Caching Minimum TTL,防止它重新发送请求以获取失败的页面到源站点,这是一个与Cache Behavior中设置的最小/默认/最大TTL不同的计时器。特别是在测试时,您可能需要禁用这些计时器,并强制重试每个返回错误的页面的后续请求,使用我在回答有关Amazon CloudFront延迟问题的步骤。


4
您是否已为源协议策略配置了匹配的查看器?S3网站终端不支持https。您需要将其设置为http。请参考:http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html - imperalix
3
谢谢!经过几天的尝试,我终于在这里找到了正确的问题和答案,明白了为什么它不能正常工作 :) - maxigs
1
这是让我困扰了很长时间的问题。在设置“Origins”时,请确保不包括“S3OriginConfig”参数,而是使用“CustomOriginConfig”。看起来很明显,但我被卡了一段时间 :) - Xolv.io
2
需要注意的另一件事是,如果您使用了CloudFront OAI(源访问标识)来限制对S3存储桶的直接访问,那么它将不再起作用。一个替代方案(虽然可以被规避)是创建并转发自定义标头,并具有检查其内容的存储桶策略。例如:https://abridge2devnull.com/posts/2018/01/restricting-access-to-a-cloudfront-s3-website-origin/ - KJH
1
@KJH,没错,OAIs不起作用,因为网站托管功能实际上只是为公开可读内容而设计的。调整S3允许策略评估的少数标头之一是在内容只需要足够“安全”以防止诚实的人进入时非常有用的。我曾考虑创建一个Lambda@Edge库来模拟Web端点功能,以避免所有这些问题,但尚未找到足够强有力的理由。 - Michael - sqlbot
显示剩余3条评论

10

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

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

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

这个文档解释了网站终端点和 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"

该脚本可以复制某些现有文件并以新文件名保存,不包括斜杠。文件的内容无关紧要,因为浏览器会立即重定向。
当您(更重要的是网络爬虫)尝试打开页面 /about 时,您会收到 301 重定向到 /about/。 这使得 Google、雅虎和其他搜索引擎可以将正确的页面保留在缓存中。
您可以为多个页面重复此代码。 或者您可以添加搜索文件夹功能并为每个文件夹进行调用。可能您会很友善地在此展示它 :)

这也适用于CloudFront,只需要将存储桶设置为公共的,这样CF就可以连接。 - goetz

0

您可能希望使用Lambda@Edge来抽象重定向,并将Lambda部署到相应的CloudFront分发中。

S3不是完整的Web服务器,因此不支持本地重定向。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接