AWS CloudFront 背后的根域
Root domain behind AWS CloudFront
根据这个 Amazon's article,我试图让整个 WordPress 网站在 AWS CloudFront 后面运行。不仅是静态文件,还有整个网站(可以通过设置适当的缓存行为来完成)。但是,如果您使用裸域(example.com
,没有 www
),这似乎是不可能的。
即,如果 CloudFront 分配的来源是 example.com
,并且如果您将 example.com
的 CNAME 放入同一分配中,CloudFront 将偶尔产生 403 错误。经过一些挖掘后,我发现这是预期的行为,因为使用此设置,其中原点和 CNAME 值相同,CloudFront 将在自身上寻找原点并产生错误。
那么怎么才能既使用裸域又使用CloudFront做代理呢?
更新:
我已经实施了评论中建议的 origin.example.com
解决方案。我收到了一个错误,但现在可以了。
- CF 分布的起源是
origin.example.com
。
- CF 分发中的 CNAME 是
example.com
。
- 在 CF 分发的 缓存行为 设置中,
Host
header 被列入白名单。
- 在 DNS 中
origin.example.com
指向带有 A 记录的服务器 IP。
- 在 DNS 中
example.com
指向带有 ALIAS-A 记录的 CF 分布。
我对这个变通办法的唯一不满是这样可以在网上发现原始服务器的 IP 地址。脚本小子可能会意外访问 origin.example.com
而服务器的真实 IP 地址是公开的,因此您很容易受到 DDoS 攻击。代理的众多好处之一是您可以隐藏真实服务器的 IP 地址。
我目前使用 Cloudflare 作为代理主要是因为这个原因。以前我被大规模的DDoS攻击,我的服务器的IP地址被主机null-routed,所以我不得不迅速躲在Cloudflare后面,更改服务器的静态IP。从此不再头疼。我想切换到 CloduFront,但使用裸域似乎不可行。
当使用 CloudFront 缓存整个网站时,对解析为 CloudFront 的裸域 (example.com) 和 www (www.example.com) 使用 A-ALIAS 记录域名。如果您在 CloudFront 上使用 SSL,请确保两个域名都在证书中。
您必须在 DNS 中创建另一个主机名,指向该实例,例如 origin.example.com
。但是实例不需要知道这个名字。
使用这个新主机名作为源域名创建 CloudFront 源,然后在缓存行为中,将 Host
header 列入白名单以转发到源。
在 DNS 中,将 example.com
仅 指向 CloudFront。
CloudFront 随后将使用备用名称查找实例的实际 IP 地址,但会在发送到源的请求中保留原始主机名 (example.com
)。
如果其他人遇到此问题,则问题可能出在证书上。如果您的证书用于“*.example.com”,请确保它也添加了“example.com”。如果没有,创建一个新的。
根据这个 Amazon's article,我试图让整个 WordPress 网站在 AWS CloudFront 后面运行。不仅是静态文件,还有整个网站(可以通过设置适当的缓存行为来完成)。但是,如果您使用裸域(example.com
,没有 www
),这似乎是不可能的。
即,如果 CloudFront 分配的来源是 example.com
,并且如果您将 example.com
的 CNAME 放入同一分配中,CloudFront 将偶尔产生 403 错误。经过一些挖掘后,我发现这是预期的行为,因为使用此设置,其中原点和 CNAME 值相同,CloudFront 将在自身上寻找原点并产生错误。
那么怎么才能既使用裸域又使用CloudFront做代理呢?
更新:
我已经实施了评论中建议的 origin.example.com
解决方案。我收到了一个错误,但现在可以了。
- CF 分布的起源是
origin.example.com
。 - CF 分发中的 CNAME 是
example.com
。 - 在 CF 分发的 缓存行为 设置中,
Host
header 被列入白名单。 - 在 DNS 中
origin.example.com
指向带有 A 记录的服务器 IP。 - 在 DNS 中
example.com
指向带有 ALIAS-A 记录的 CF 分布。
我对这个变通办法的唯一不满是这样可以在网上发现原始服务器的 IP 地址。脚本小子可能会意外访问 origin.example.com
而服务器的真实 IP 地址是公开的,因此您很容易受到 DDoS 攻击。代理的众多好处之一是您可以隐藏真实服务器的 IP 地址。
我目前使用 Cloudflare 作为代理主要是因为这个原因。以前我被大规模的DDoS攻击,我的服务器的IP地址被主机null-routed,所以我不得不迅速躲在Cloudflare后面,更改服务器的静态IP。从此不再头疼。我想切换到 CloduFront,但使用裸域似乎不可行。
当使用 CloudFront 缓存整个网站时,对解析为 CloudFront 的裸域 (example.com) 和 www (www.example.com) 使用 A-ALIAS 记录域名。如果您在 CloudFront 上使用 SSL,请确保两个域名都在证书中。
您必须在 DNS 中创建另一个主机名,指向该实例,例如 origin.example.com
。但是实例不需要知道这个名字。
使用这个新主机名作为源域名创建 CloudFront 源,然后在缓存行为中,将 Host
header 列入白名单以转发到源。
在 DNS 中,将 example.com
仅 指向 CloudFront。
CloudFront 随后将使用备用名称查找实例的实际 IP 地址,但会在发送到源的请求中保留原始主机名 (example.com
)。
如果其他人遇到此问题,则问题可能出在证书上。如果您的证书用于“*.example.com”,请确保它也添加了“example.com”。如果没有,创建一个新的。