为什么S3网站的redirect位置不被CloudFront所遵循?

我有一个在Amazon S3上托pipe的网站。 这是在WordPress上托pipe的旧网站的新版本。

我已经使用元数据Website Redirect Location设置了一些文件来处理旧的位置,并将它们redirect到新的网站页面。

例如:我有http://www.mysite.com/solution ,我想redirect到http://mysite.s3-website-us-east-1.amazonaws.com/product.html所以,我创build了一个空使用正确的元数据命名我的存储桶中的solution

Website Redirect Location = /product.html

S3redirect元数据相当于301 Moved Permanently ,这对search引擎优化非常有用。 当从S3域直接访问URL时,这很好用。

我也build立了基于网站桶的CloudFront分配。 而当我尝试通过我的分配访问,redirect不起作用,即:

http://xxxx123.cloudfront.net/solution不redirect,而是下载空文件。

所以我的问题是如何保持通过CloudFront分配redirect? 或者有关如何处理redirect而不会恶化SEO的任何想法?

谢谢

我最近遇到这个问题,我发现一个解决方法,似乎工作。

我创build了一个具有指向S3静态网站主机名而不是存储桶主机名的自定义来源的Cloudfront分配。 在OP的情况下,期望的起源将是。

 mysite.s3-website-us-east-1.amazonaws.com 

仅使用存储桶作为原点来打击Cloudfront分配不起作用,因为存储桶实际上并不能提供redirect。 它只提供文件和存储元数据。

希望有所帮助。

分析

根据logging的“ 请求和响应行为”以及“自定义起源支持的HTTP状态代码” , Amazon CloudFront不遵循redirect :

[…]configurationredirect后,当最终用户第一次提交对象请求时,CloudFront Front会将请求发送到原点,并且原点以redirect(例如302 Moved Temporarily)进行响应。 CloudFront将redirectcaching并将其返回给最终用户。 CloudFront不遵循redirect。 [强调我的]

当然,您正在使用Amazon S3而不是自定义来源,并且Amazon S3 Origins的请求和响应行为中显然缺less相关部分,但是由于Amazon S3redirect只是最近才添加的(请参阅Amazon S3 – 对网站的支持redirect ),它可能只是在那里丢失。

因此,我冒昧猜测你没有收到一个HTTP状态代码为200 OK的空文件,而是一个HTTP状态301永久移动永远没有身体 – 你真的用浏览器检查过这个,或者最终只使用像命令行工具例如cURL或HTTPie ? 后面的工具通常需要一个明确的参数来跟踪redirect,所以这可能很容易被忽视。

潜在的解决scheme

如果分析结果正确,则需要将redirectconfiguration为明确定位CloudFront,请再次参阅redirect :

您可以将您的Web服务器configuration为将请求redirect到以下位置之一:

  • 原始服务器上对象的新URL。 当最终用户遵循redirect到新的URL时,最终用户绕过CloudFront并直接到达原点。 因此,我们build议您不要将请求redirect到原始对象的新URL。

  • 对象的新CloudFront URL。 当最终用户提交包含新CloudFront URL的请求时,CloudFront将从原来的新位置获取对象,将其caching在边缘位置,然后将该对象返回给最终用户。 对象的后续请求将由边缘位置提供服务。 这避免了观看者从原点请求对象的延迟和负载。 但是,每次对该对象的新请求都将收取针对CloudFront的两项请求的费用。