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的主要内容,如果未能解决你的问题,请参考以下文章