CloudFront 动态内容和 Apache 使用多个虚拟主机

CloudFront 动态内容和 Apache 使用多个虚拟主机

我已尝试设置 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 实例。我知道,这很令人沮丧。

他们知道这个问题(写这篇文章的时候);希望它能很快被修复:

https://forums.aws.amazon.com/thread.jspa?threadID=84588

答案2

现在这个问题已经被亚马逊解决了。

检查此链接:https://forums.aws.amazon.com/message.jspa?messageID=552969#552969

还有这个链接:http://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/

答案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>

相关内容