我试图让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?
谢谢你提前!
答案 0 :(得分:2)
我无法想出Cloudfront会发布这些重定向的情况。
可能发生的事情是您的服务器本身正在发出302重定向,因为它不喜欢它从Cloudfront获得的Host:
标头。
Host:
CloudFront将值设置为与请求对象关联的源的域名。
然后,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系统都使用这些系统,使我能够更轻松地操作和修改行为。