AWS S3 不会将 https://www.example.com 重定向到 https://example.com,但会重定向 http://www.example.com

Posted

技术标签:

【中文标题】AWS S3 不会将 https://www.example.com 重定向到 https://example.com,但会重定向 http://www.example.com【英文标题】:AWS S3 won't redirect https://www.example.com to https://example.com, but will redirect http://www.example.com 【发布时间】:2020-12-21 03:42:33 【问题描述】:

我在 S3 上设置了我的网站,并以 CloudFront 为前端。就托管等而言,一切正常,但在将https://www.example.com 重定向到https://example.com 时,我遇到了一些奇怪的问题。

我已将站点设置为植根于example.com。我有两个 S3 存储桶,一个用于根域(即example.com),一个用于www.example.com。主要内容托管在example.com 存储桶中,而www 存储桶为空。

www S3 存储桶设置为将所有请求重定向到example.com 域。我已清除协议字段,以便它与原始请求匹配。重定向域只是说example.com

www 存储桶的政策非常基本,但为了完整起见,我将其包含在此处:


    "Version": "2012-10-17",
    "Statement": [
        
            "Sid": "2",
            "Effect": "Allow",
            "Principal": 
                "AWS": "arn:aws:iam::cloudfront:user/..."
            ,
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::www.example.com/*"
        
    ]

最终发生的事情是我可以成功地将http://www.example.com 重定向到https://example.com,但https://www.example.com/ 只是挂起。在curl 中检查此内容只会导致超时。

在 CloudFront 方面,我的 CF 分发设置使用 example.com 作为备用域,而我的 Origin 仅指向我的 example.com 存储桶。

我将 Route53 用于 DNS,www.example.com A 记录指向 www S3 存储桶,而 example.com 的 A 记录指向 CloudFront 分配。

我在这里完全不知所措,我们将不胜感激。

【问题讨论】:

为什么R53中的www.example.com直接指向bucket?您的存储桶策略仅允许来自 CF 的 OAI 用户访问它。因此,直接访问(即,没有 CF)应该是不可能的。 是的,鉴于没有可下拉的内容,这是一个虚假的策略,但重定向应该首先命中。请记住,该策略适用于 GetItem,但由于没有任何项目,它不应该启动。尽管如此,我仍然需要 www 站点的 DNS 条目,所以这仍然是必要的。 S3 网站端点不支持 HTTPS。所以如果你只是直接去bucket s3网站端点,就不会有HTTPS,这可以解释为什么你的https://www.example.com不起作用。 为了提供网络内容,当然可以,但是如果它们只支持http,为什么还要提供匹配重定向设置协议的选项呢?有些东西没有加起来。 "Amazon S3 不支持 HTTPS 访问网站。如果您想使用 HTTPS,可以使用 Amazon CloudFront 服务托管在 Amazon S3 上的静态网站。"来自here。但是您写道“example.com/simply 挂起”。您不能按照文档中的说明使用 HTTPS。为此,您必须使用 CF。因此,我不明白为什么您的“www.example.com A 记录指向 www S3 存储桶”。它应该指向 CF,而不是 s3 存储桶。 【参考方案1】:

好吧,我终于想通了。感谢 @Marcin 为我指明了正确的方向,感谢一位乐于助人的 Reddit 用户,他为我提供了一个快速的 Lambda 函数。

基本上我不得不使用第二个 CloudFront 分配来处理 www.example.com 域的 HTTPS 前端(就像 @Marcin 提到的),但仅此一项并不能解决问题。即使将存储桶配置为仅执行重定向,底层 S3 存储桶仍返回 403 错误。

为了解决这个问题,我必须创建一个新的 Lambda @ Edge 函数,在 Host 标头中查找 www 前缀,然后通过第二个 CF 实例上的 lambda 执行 301 重定向。我将其添加为 CF 分发的 Viewer-Request 级别触发器,现在一切都符合预期。

【讨论】:

【参考方案2】:

您必须为此存储桶 www.example.com 启用 CloudFront 才能访问此 https://www.example.com/ 并指向 www.example.com 存储桶才能正确重定向。

将 CloudFront 设置为与 example.com 相同的 www.example.com 即可。

【讨论】:

以上是关于AWS S3 不会将 https://www.example.com 重定向到 https://example.com,但会重定向 http://www.example.com的主要内容,如果未能解决你的问题,请参考以下文章

AWS s3 同步从 s3 复制到 EMR 很慢

AWS S3 代理使用方法

用于将 svg 图像上传到 AWS S3 的内容类型

如何解决 AWS::S3::Errors:: 拒绝访问?

AWS Lambda 不会等待代码上传到 Terraform 脚本中的 S3 存储桶

如何对上传到 AWS S3 的文件执行自动病毒扫描