使用 S3、Cloudfront、SSL 设置静态网站时出现 301 重定向循环
301 redirect loop when setting up static website with S3, Cloudfront, SSL
我正在尝试使用 HTTPS 在 AWS 中为 example.com
和 www.example.com
托管一个静态网站。我当前的设置正确地重定向到 example.com
,但点击了 Chrome 无数 301 重定向。
最有希望的信息是本教程:
和这个 Whosebug 答案:
我有两个 S3 存储桶。在 S3 的 AWS 控制台中,www.example.com
设置为通过 https 重定向到 example.com
,并且 example.com
设置为托管静态网站。
我有两个 Cloudfront 发行版,每个发行版都使用来自 us-east-1 区域的 ACM 生成的 SSL 证书。原始域名是通过复制/粘贴相应的 S3 端点 URL 而不是使用下拉自动填充来设置的。备用域名设置为每个分配的匹配域 www.example.com
或 example.com
。
在 Route53 中,我有两个 A 记录,每个域一个。两者都可以看到它们相应的 Cloudfront 发行版填充了 Alias 菜单中的下拉列表,并且已被选中。
即使在我直接使用长格式 url 访问 S3 端点的情况下,301 错误似乎也来自云端(Chrome devtools 中的 http 响应值为 X-Cache: Redirect from cloudfront
)。
该网站只不过是带有一些文字的 index.html。没有 javascript 在玩。
非常感谢任何帮助。在这燃烧的日子..
我之前看到的解决方法如下:
- 为顶点 (
example.com
) 提供 CloudFront 分配
- 为
www
子域设置 CloudFront 分配
- 删除在应用程序或任何分发中完成的任何 301 重定向
- 添加 Lambda@Edge 函数以在
www
域的 CloudFront 分配上执行 302
redirect 仅。
重定向函数如下所示
def lambda_handler(event, context):
# Generate HTTP redirect response with 302 status code and Location header.
uri = request = event['Records'][0]['cf']['request']['uri']
response = {
'status': '302',
'statusDescription': 'Found',
'headers': {
'location': [{
'key': 'Location',
'value': 'https://example.com/' + uri
}]
}
}
return response
您看到这个的可能原因是 example.com 也在重定向到它自己。
同时使用 302
而不是 301
进行测试。 301
是永久重定向,在尝试回滚已经访问过此 URL 的浏览器的任何更改时可能会导致问题。
如果您正在寻找一种更好的方法来使用 S3 和 Cloudfront 托管您的网站,而无需使用 Lambda 函数,我为此创建了一个分步教程,请查看
https://www.youtube.com/watch?v=94DyGswSY6k&t=1475s
我正在尝试使用 HTTPS 在 AWS 中为 example.com
和 www.example.com
托管一个静态网站。我当前的设置正确地重定向到 example.com
,但点击了 Chrome 无数 301 重定向。
最有希望的信息是本教程:
和这个 Whosebug 答案:
我有两个 S3 存储桶。在 S3 的 AWS 控制台中,www.example.com
设置为通过 https 重定向到 example.com
,并且 example.com
设置为托管静态网站。
我有两个 Cloudfront 发行版,每个发行版都使用来自 us-east-1 区域的 ACM 生成的 SSL 证书。原始域名是通过复制/粘贴相应的 S3 端点 URL 而不是使用下拉自动填充来设置的。备用域名设置为每个分配的匹配域 www.example.com
或 example.com
。
在 Route53 中,我有两个 A 记录,每个域一个。两者都可以看到它们相应的 Cloudfront 发行版填充了 Alias 菜单中的下拉列表,并且已被选中。
即使在我直接使用长格式 url 访问 S3 端点的情况下,301 错误似乎也来自云端(Chrome devtools 中的 http 响应值为 X-Cache: Redirect from cloudfront
)。
该网站只不过是带有一些文字的 index.html。没有 javascript 在玩。
非常感谢任何帮助。在这燃烧的日子..
我之前看到的解决方法如下:
- 为顶点 (
example.com
) 提供 CloudFront 分配 - 为
www
子域设置 CloudFront 分配 - 删除在应用程序或任何分发中完成的任何 301 重定向
- 添加 Lambda@Edge 函数以在
www
域的 CloudFront 分配上执行302
redirect 仅。
重定向函数如下所示
def lambda_handler(event, context):
# Generate HTTP redirect response with 302 status code and Location header.
uri = request = event['Records'][0]['cf']['request']['uri']
response = {
'status': '302',
'statusDescription': 'Found',
'headers': {
'location': [{
'key': 'Location',
'value': 'https://example.com/' + uri
}]
}
}
return response
您看到这个的可能原因是 example.com 也在重定向到它自己。
同时使用 302
而不是 301
进行测试。 301
是永久重定向,在尝试回滚已经访问过此 URL 的浏览器的任何更改时可能会导致问题。
如果您正在寻找一种更好的方法来使用 S3 和 Cloudfront 托管您的网站,而无需使用 Lambda 函数,我为此创建了一个分步教程,请查看 https://www.youtube.com/watch?v=94DyGswSY6k&t=1475s