当在 Apache 中使用 CNAME 设置别名时实际上请求什么?

当在 Apache 中使用 CNAME 设置别名时实际上请求什么?

我在我的开发机器上设置了许多子域,如下所示。

  • test1.example.com => 192.168.0.7
  • test2.example.com => 192.168.0.7
  • ...(大约有 30 个域名与此类似)

我的开发服务器上有许多网站,Apache 可以根据域名处理这些网站。

但是我不太喜欢设置固定 IP,所以我想使用别名,如下所示:

  • default.example.com => 192.168.0.7
  • test1.example.com => (CNAME) default.example.com
  • test2.example.com => (CNAME) default.example.com

这里的优点是,当开发服务器的 IP 发生变化时,我只需要更改一个,而不是多个。

如果我test1.example.com向 Apache 服务器发出请求,它会将其视为test1.example.com或吗default.example.com

答案1

这通常是一个好主意,正如您所指出的,您现在只需要在一个地方更改 IP。

客户端将查找 test1,指向默认,然后获取 IP。然后它将连接到 Apache 并告诉 Apache 它想要 test1 站点(它不会告诉服务器它是如何找到服务器的,只是告诉原始请求是什么)。

答案2

您已发现 CNAME 记录的一个主要优势。

就 Apache 而言,HTTP 标头 Host 字段将保留在客户端输入的任何内容,并且 CNAME 将不起作用。

CNAME 的一个可能的缺点是,查找具有 CNAME 条目的记录将需要两次查询,第一次获取 CNAME,第二次获取 A 记录。这可能不是什么大问题,但值得一提。

最后,要小心“链接 CNAME”,即创建一个 CNAME 到另一个 CNAME。虽然 RFC 允许这样做,但不鼓励这样做。

答案3

回答你的最后一个问题:如果你NameVirtualHost在 Apache 中使用指令,并为每个 CNAMEed 条目设置一个 vhost,你将获得由该 vhost 定义的唯一页面。

NameVirtualHost *:80
<VirtualHost *:80>
    ServerName test1.example.com
    DocumentRoot /var/www/test1
</VirtualHost>

一般来说,根据我的经验,我建议您不要依赖任何实时内容的默认配置,而是为每个名称设置一个虚拟主机(如果需要,可以使用服务器别名)。总会有例外,但这通常更容易调试,因为您托管的每个名称都是通过在配置中明确定义的。

相关内容