与Route 53集成时未达到Cloudfront

时间:2014-06-11 12:36:14

标签: amazon-web-services amazon-cloudfront amazon-route53

我试图让Cloudfront在我的解决方案上运行。我使用的是Route 53 + CloudFront + ELB。

请考虑以下事项: 1. Route 53通过记录集别名指向CloudFront。 2. CloudFront通过原始域名指向ELB。 3. CloudFront将备用域名设置为我的自定义域(mysite.com)

如果我使用CloudFront域名(d1ngxxxx.cloudfront.net)或自定义域(mysite.com)发出请求,则初始请求将转至CloudFront,后者将以HTTP 302响应。所有后续请求(针对资源)像images,css,js ..)直接绕过CloudFront的ELB域名。 我应该怎么做才能让所有请求都通过CloudFront?

谢谢你提前!

1 个答案:

答案 0 :(得分:2)

我无法想出Cloudfront会发布这些重定向的情况。

可能发生的事情是您的服务器本身正在发出302重定向,因为它不喜欢它从Cloudfront获得的Host:标头。

  

Host: CloudFront将值设置为与请求对象关联的源的域名。

     

- http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html

然后,Cloudfront将重定向返回到浏览器。

Cloudfront还可以缓存此类重定向,因此在进行故障排除时请注意。响应标头应指示cloudfront是否转到特定响应的原点:

X-Cache: Miss from cloudfront

...或者cloudfront是否从缓存中提供了请求。

X-Cache: Hit from cloudfront

两种可能的方法来解决这个问题:

如果遗留代码以负面方式对Host:标头作出反应,您可能可以重新配置Web服务器以在代码能够看到它之前修改该值,因此重定向不会发生。

或者,您可以使用外置的东西,反向代理引擎,如Varnish或HAProxy(我已经触及elsewhere)。在HAProxy中,举个简单的例子:

reqirep ^Host:\ .* Host:\ expected-domain.example.com if { hdr(host) -i unexpected-domain.example.com }

与此类似的表单中的规则会在存在该标头的所有传入请求中将Host: unexpected-domain.example.com标头替换为Host: expected-domain.example.com,这样可以保留旧代码并避免重定向。在遗留系统前运行HAProxy不会产生很大的负担,因为代码非常紧张。我现在所有的遗留Web系统都使用这些系统,使我能够更轻松地操作和修改行为。