使用 S3、Cloudfront、SSL 设置静态网站时出现 301 重定向循环

301 redirect loop when setting up static website with S3, Cloudfront, SSL

我正在尝试使用 HTTPS 在 AWS 中为 example.comwww.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.comexample.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