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