【问题标题】:Root domain behind AWS CloudFrontAWS CloudFront 背后的根域
【发布时间】:2018-10-22 15:02:30
【问题描述】:

根据Amazon's article,我试图让整个 WordPress 网站在 AWS CloudFront 后面运行。不仅是静态文件,还有整个网站(可以通过设置适当的缓存行为来完成)。但是,如果您使用裸域(example.com,没有www),这似乎是不可能的。

也就是说,如果 CloudFront 分配的来源是 example.com,并且如果您将 example.com 的 CNAME 放在同一分配中,CloudFront 将偶尔产生 403 错误。经过一番挖掘,我发现这是预期的行为,因为在此设置中,来源和 CNAME 值相同,CloudFront 会自行查找来源并产生错误。

那么如何同时使用裸域和CloudFront作为代理呢?


更新:

我已经实现了 cmets 中建议的 origin.example.com 解决方案。我遇到了一个错误,但现在它可以工作了。

  1. CF 分发中的来源是origin.example.com
  2. CF 分发中的 CNAME 是 example.com
  3. 在 CF 分发的 缓存行为 设置中,Host 标头被列入白名单。
  4. 在 DNS 中,origin.example.com 指向带有 A 记录的服务器 IP。
  5. 在 DNS 中,example.com 指向具有 ALIAS-A 记录的 CF 分发。

我对这种解决方法的唯一不满是,通过这种方式可以在网络上发现源服务器的 IP 地址。脚本小子可能会意外访问origin.example.com,并且服务器的真实 IP 地址是公开的,因此您很容易受到 DDoS 攻击。代理的众多好处之一是您可以隐藏真实服务器的 IP 地址。

我目前使用 Cloudflare 作为代理主要是因为这个原因。过去我遭受了大规模的 DDoS 攻击,并且我的服务器的 IP 地址被主机路由为空,所以我不得不迅速躲在 Cloudflare 后面并更改服务器的静态 IP。从那以后就没有头疼了。我想切换到 CloduFront,但使用裸域似乎不可行。

【问题讨论】:

  • 如果您将缓存行为配置为将 Host 标头列入白名单以转发源,则 CloudFront 认为源证书与 Host 标头匹配时有效。它不需要匹配您用于路由的主机名。但请注意age: 227。这是一个缓存错误。请参阅我关于设置错误缓存最小 TTL 的评论。
  • @Michael-sqlbot 我没有忘记,我创建了一个 TTL 为零的自定义 503 错误页面。我假设我不必为每一种错误页面类型重复该过程。
  • 不,只是你得到的错误就足够了。目前尚不清楚您的错误页面为何/如何具有age 标头。
  • 我已经搞定了@Michael-sqlbot。这是一件小事。我将origin.example.com 放置在 Route 53 中,我应该将它放在我当前的 DNS 服务器中。该域未连接到 Route 53,它已连接到我当前的 DNS 服务器。感谢您的帮助。
  • 我还有一个子问题@Michael-sqlbot。如果要使用代理,这一点非常重要。如果我切换到 CloudFront,从而切换到 Route 53,如果有人扫描 origin.example.com,会发现源服务器的 IP 地址吗?到目前为止,我支持 Cloudflare,如果我直接访问 origin.example.com,它会显示 Invalid SSL Error,这很好,它会显示 Cloudflare 的 IP 地址。如果我离开 Cloudfllare,在这种情况下会发生什么?

标签: amazon-web-services caching proxy amazon-cloudfront bare-domain


【解决方案1】:

您必须在 DNS 中创建另一个指向实例的主机名,例如 origin.example.com。但是实例不需要知道这个名字。

使用此新主机名作为源域名创建 CloudFront 源,然后在缓存行为中,将 Host 标头列入白名单以转发到源。

在 DNS 中,将example.com 指向 CloudFront。

CloudFront 随后将使用备用名称来查找实例的实际 IP 地址,但会在发送到源的请求中保留原始主机名 (example.com)。

【讨论】:

  • 我有一些问题:添加default以外的行为时,您需要输入路径模式。所以我假设origin.example.com 的路径模式将只是*?所有其他行为(default,例如*.jpg 等)是否应该使用example.com 作为起源?这个新的转发行为需要放在哪个位置?在顶部所以它优先?这种转发方法是否对速度有影响,可能是 SEO 等?这样实例的IP是否可以被发现,从而取消代理效应?
  • 我看到你有更长的解释 here 但我仍然收到错误。
  • 设置您的Error Caching Minimum TTLs to 0,然后为/* 设置cache invalidation。等待失效完成,分发从In Progress切换到Deployed,然后再次测试。如果您继续收到错误,请捕获包括标题在内的整个响应,并将其编辑到您的问题中。
  • 我已按照您的建议进行操作,但无济于事。我已将答案包含在问题中。
【解决方案2】:

如果其他人遇到此问题,则问题可能出在证书上。如果您的证书适用于“*.example.com”,请确保它还添加了“example.com”。如果没有,请创建一个新的。

【讨论】:

    【解决方案3】:

    在使用 CloudFront 缓存整个网站时,请为裸域 (example.com) 和解析为 CloudFront 域名的 www (www.example.com) 使用 A-ALIAS 记录。如果您在 CloudFront 上使用 SSL,请确保两个域名都在证书中。

    【讨论】:

    • 我认为这并不能解决问题。 CloudFront 将无法找到该实例。您需要一个指向服务器 IP 地址的实际 A 记录。
    • 我忘了设置源域。您需要一个 dns 条目,其中包含带有实际服务器 IP 地址的 A 记录。例外情况是服务器是 ELB/ALB 的一部分(这是我通常设置的)。
    • 仍然无法开始工作。根据@michael-sqlbot 的回答,我将带有 A 记录的 origin.example.com 指向服务器的 IP 地址。由于它是一个实时站点,我正在更改我的本地 hosts 文件以在本地影响 DNS,以便查看更改。在我的本地hosts 文件中,example.com 具有 CF 分发 IP 之一,origin.example.com 具有服务器 IP。
    • @Vila origin.example.com 记录实际上需要进入 DNS。 CloudFront 看不到您的主机文件。
    • 不要将 IP 地址用于 CloudFront。您的 DNS 记录的 TTL 值是多少?您必须至少等待那个时间才能看到更改传播。我用的是 Chrome,它记住太多东西太久了,所以我必须在测试时刷新它的缓存。
    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2018-07-30
    • 2019-02-22
    • 2019-02-26
    • 1970-01-01
    • 2021-01-31
    • 2017-10-23
    相关资源
    最近更新 更多