我已尝试设置 CloudFront 来指向弹性负载均衡器。
我可以看到请求正在到达 Web 服务器(配置了多个虚拟主机),但是请求总是最终到达 /var/www/error/noindex.html 页面。
如果我从 www DNS 中删除 CloudFront,则网站可以通过 ELB 在 apache 上正常运行。
此外,我还为每个域名设置了 CName www。
您对为什么这些 CloudFront 请求会到达错误页面有任何想法吗?
谢谢
答案1
Cloudfront 目前无法将 Host 标头传回原点。相反,它会传递 Cloudfront 分发版的原点字段中指定的主机。因此,虽然通过 ELB 查看页面会正确地将您在浏览器中提供的主机名传回您的 Web 实例(从而调出正确的虚拟主机),但通过 Cloudfront 向 ELB 和 Web 实例发出的相同请求将以 ELB 的主机名到达 Web 实例。我知道,这很令人沮丧。
他们知道这个问题(写这篇文章的时候);希望它能很快被修复:
答案2
答案3
通过在请求过程中添加一个步骤即可解决该问题。Cloudfront 会将“原始域名”转发为请求中的“Host”标头变量。这是您的 Web 服务器用来决定在提供内容时使用哪个虚拟主机的信息。
假设您想将访问者发送到 subdomain1.domain.com 和 subdomain2.domain.com,并且这两个都是同一 Web 服务器上的虚拟主机。
首先为您的 cloudfront 分发创建 CNAME 条目。每个子域使用一个分发,如下所示:
subdomain1.domain.com. 300 IN CNAME d1234567890.cloudfront.net.
subdomain2.domain.com. 300 IN CNAME d0987654321.cloudfront.net.
不要将您的 Cloudfront 发行版直接指向负载均衡器,而是在“源域名”中使用中间地址。因此,您的 Cloudfront 发行版设置将如下所示:
d1234567890.cloudfront.net
Alternate Domain Names(CNAMEs): subdomain1.domain.com
Origin Domain Name: subdomain1-intermediary.domain.com
d0987654321.cloudfront.net
Alternate Domain Names(CNAMEs): subdomain2.domain.com
Origin Domain Name: subdomain2-intermediary.domain.com
现在创建额外的 CNAME 条目,将中间地址定向到您的负载均衡器:
subdomain1-intermediary.domain.com. 300 IN CNAME LOADBALANCER.eu-west-1.elb.amazonaws.com.
subdomain2-intermediary.domain.com. 300 IN CNAME LOADBALANCER.eu-west-1.elb.amazonaws.com.
当请求通过负载平衡器并到达您的服务器时,它将在请求的“Host”标头中看到 subdomain1-intermediary.domain.com 或 subdomain2-intermediary.domain.com。您现在要做的就是定义您的虚拟主机。在 IIS 中,规则如下所示:
<rule name="rule1">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="subdomain1-intermediary.domain.com" />
</conditions>
<serverVariables>
<set name="HTTP_HOST" value="subdomain1.domain.com" />
</serverVariables>
<action type="None" />
</rule>
<rule name="rule2">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="subdomain2-intermediary.domain.com" />
</conditions>
<serverVariables>
<set name="HTTP_HOST" value="subdomain2.domain.com" />
</serverVariables>
<action type="None" />
</rule>