Apache HTTP Server 版本 2.4
这段话可以概括为:不要以依赖 DNS 解析来解析配置文件的方式配置 Apache HTTP Server。如果 httpd 需要 DNS 解析来解析配置文件,那么您的服务器可能会遇到可靠性问题(例如,它可能无法启动),或者遭受拒绝服务和窃取服务攻击(包括虚拟主机能够窃取来自其他虚拟主机的流量)。
# This is a misconfiguration example, do not use on your server <VirtualHost www.example.dom> ServerAdmin [email protected] DocumentRoot "/www/example" </VirtualHost>
为了使服务器正常运行,它绝对需要关于每个虚拟主机的两条信息:ServerName
和服务器将绑定并响应的至少一个 IP 地址。上面的例子没有包含 IP 地址,因此 httpd 必须使用 DNS 来查找 www.example.dom
的地址。如果由于某种原因,在您的服务器解析其配置文件时 DNS 不可用,那么这个虚拟主机将不会被配置。它将无法响应对该虚拟主机的任何访问。
假设 www.example.dom
的地址是 192.0.2.1。然后考虑以下配置片段
# This is a misconfiguration example, do not use on your server <VirtualHost 192.0.2.1> ServerAdmin [email protected] DocumentRoot "/www/example" </VirtualHost>
这次 httpd 需要使用反向 DNS 来查找该虚拟主机的 ServerName
。如果反向查找失败,它将部分禁用虚拟主机。如果虚拟主机是基于名称的,那么它将被完全禁用,但如果它是基于 IP 的,那么它将大部分正常工作。但是,如果 httpd 必须为服务器生成一个包含服务器名称的完整 URL(例如,当发出重定向时),那么它将无法生成有效的 URL。
以下是一个避免这两个问题的片段
<VirtualHost 192.0.2.1> ServerName www.example.dom ServerAdmin [email protected] DocumentRoot "/www/example" </VirtualHost>
考虑以下配置片段
<VirtualHost www.example1.dom> ServerAdmin [email protected] DocumentRoot "/www/example1" </VirtualHost> <VirtualHost www.example2.dom> ServerAdmin [email protected] DocumentRoot "/www/example2" </VirtualHost>
假设您已将 192.0.2.1 分配给 www.example1.dom
,并将 192.0.2.2 分配给 www.example2.dom
。此外,假设 example1.dom
可以控制自己的 DNS。使用此配置,您已将 example1.dom
置于可以窃取所有发送到 example2.dom
的流量的位置。为此,他们只需将 www.example1.dom
设置为 192.0.2.2 即可。由于他们控制着自己的 DNS,因此您无法阻止他们将 www.example1.dom
记录指向任何他们想要的位置。
进入 192.0.2.2 的请求(包括所有用户输入形式为 http://www.example2.dom/whatever
的 URL 的请求)都将由 example1.dom
虚拟主机提供服务。要更好地理解为什么会发生这种情况,需要更深入地讨论 httpd 如何将传入请求与将提供服务的虚拟主机匹配。有关此方面的粗略文档在此处提供。
基于名称的虚拟主机支持 需要 httpd 了解运行 httpd
的主机的 IP 地址。为了获取此地址,它使用全局 ServerName
(如果存在)或调用 C 函数 gethostname
(它应该返回与在命令提示符下键入“hostname”相同的结果)。然后,它对该地址执行 DNS 查找。目前,无法避免此查找。
如果您担心此查找可能会失败,因为您的 DNS 服务器已关闭,那么您可以在 /etc/hosts
中插入主机名(您可能已经拥有它,以便机器能够正常启动)。然后确保您的机器配置为在 DNS 失败时使用 /etc/hosts
。根据您使用的操作系统,这可以通过编辑 /etc/resolv.conf
或 /etc/nsswitch.conf
来实现。
如果您的服务器不需要出于任何其他原因执行 DNS,那么您可能可以运行 httpd,并将 HOSTRESORDER
环境变量设置为“local”。这完全取决于您使用的操作系统和解析器库。它还会影响 CGI,除非您使用 mod_env
来控制环境。最好查阅您操作系统的联机帮助页或常见问题解答。
VirtualHost
中使用 IP 地址Listen
中使用 IP 地址ServerName
<VirtualHost _default_:*>
服务器