我正在尝试做一些相对简单的事情 - 我想设置几个域和子域来重定向到我们网站的核心域,但我想将重定向放在 Cloudfront 上。除了重定向根路径外,一切都正常 - 这会给我一个部分描述 S3 存储桶的 XML 文件。
背景
S3
S3 可让您设置全部重定向存储桶, 喜欢:
测试一下,Web 端点 (brass9-com.s3-website-us-west-1.amazonaws.com) 执行了它应该执行的操作 - 它重定向到 brass9.com。很好。
云端
Cloudfront 允许您指向一个 S3 存储桶,但它建议您这样做的方式是错误的 - 而不是通过名称指向存储桶,例如 brass9-com.s3.amazonaws.com,您需要使用 Web 端点以上。除此之外,您可以保留所有默认值并获得良好的重定向行为。因此,类似www.brass9.com/portfolio正确地重定向到它应该重定向到的位置。也很好。
问题——根域名重定向
然后唯一不起作用的就是从普通的重定向www.brass9.com。它不会让你重定向,而是给你这个奇怪的结果:
<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>brass9-com</Name><Prefix></Prefix>
<Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated>
</ListBucketResult>
好的...那么这并不完全出乎意料- 因为没有默认根对象。但是我可能会指定什么默认根对象来阻止此行为?我需要指向的 S3 重定向对象(如果有)的名称是什么?或者是否有其他适当的配置,或者这只是 Cloudfront 和 S3 交互方式中的一个错误,需要 Amazon 修复?
已知不起作用的解决方案:默认根对象
可以指定 index.html 的默认根对象,但这没有任何帮助 - 它只是改变了问题。Cloudfront url 反而会重定向到主站点上的 /index.html,这是一个 404(我们不使用 index.html 文件,它是一个服务器端框架驱动的站点)。我可以将 index.html 放在服务器上,但这首先会抵消使用 Cloudfront 带来的微小速度提升。
类似问题
有一个问题问了类似的问题,但得到了空白的 0 字节响应出于某种原因,我看到的不是 XML 响应。它不包含有关该问题的问题或解决方案。
相关文章
一篇文章建议你在裸域和 www 域上提供整个站点的服务。这会影响任何用户的书签、您的搜索排名等。您不应该这样做。
几位讨论在 S3 和 Cloudfront 上托管静态网站而不是重定向方案,因此无关。
那么,我该如何正确地做到这一点?
Cloudfront 配置的屏幕截图 - 没有默认根对象,指向 S3 源。忽略 InProgress - 我刚刚打开和关闭了默认根对象以进行测试。
该分布的原点配置如下:
答案1
如果您遇到此问题,请首先检查为 cloudfront 配置 s3 bucket origin 时自动完成功能返回 s3 REST 端点domain.amazonaws.com 返回此 ListBucketResult 响应。
你必须写下来手动网站端点 domain.s3-website-region.amazonaws.com
重要的:如果你错误地配置了 cloudfront 的 REST 端点,你必须通过 Invalidations 使缓存失效,否则它将继续返回 REST 响应
答案2
解决方案:按照问题所述设置重定向,然后等待 S3 和 CloudFront 缓存时间结束。它们可能长达 4 小时或更长时间,因此您只需设置好一切,然后等待并希望获得最佳结果。
(这是迈克尔在评论中给出的解决方案,但已经过去好几年了,这个问题确实值得被标记为已回答)。
答案3
由于我无法发表评论,因此将其作为答案写入 - 来自文档http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/DistributionConfigDatatype.html#DistributionConfigDatatype_Elements看来你可以有一个空白的默认根对象:
如果您不想在创建分发时指定默认根对象,请包含一个空的 DefaultRootObject 元素。
答案4
添加到lapinkoira 的答案(谢谢,这让我发疯了),这里是“使用 REST API”手风琴下的相关 AWS 文档:
A bucket configured for website hosting has both the website endpoint and the REST endpoint.
A request for a page that is configured as a 301 redirect has the following possible outcomes, depending on the endpoint of the request:
Region-specific website endpoint:
Amazon S3 redirects the page request according to the value of the x-amz-website-redirect-location property.
REST endpoint:
Amazon S3 doesn't redirect the page request. It returns the requested object.
下面是您可以在 AWS 存储桶上找到网站端点的屏幕截图,或者如果您使用 Terraform,请确保将其用作 cloundfront 资源块中的值aws_s3_bucket_website_configuration.<resource>.website_endpoint
。origin_access_identity
s3_origin_config