该页面可以用以下语句来概括:不要以依赖DNS解析来解析配置文件的方式配置Apache HTTP Server。如果httpd需要DNS解析来解析配置文件,则您的服务器可能会遇到可靠性问题(即,它可能无法启动),或者遭到拒绝和盗窃服务攻击(包括能够从其他虚拟主机中窃取数据的虚拟主机)。
# This is a misconfiguration example, do not use on your server <VirtualHost www.example.dom> ServerAdmin webgirl@example.dom 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 webgirl@example.dom DocumentRoot "/www/example" </VirtualHost>
这次httpd需要使用反向DNS来ServerName
为此虚拟主机找到
。如果反向查找失败,则它将部分禁用虚拟主机。如果虚拟主机是基于名称的,那么它将被完全禁用,但是如果虚拟主机是基于IP的,则它几乎可以正常工作。但是,如果httpd必须曾经为服务器生成包括服务器名称的完整URL(例如,发出重定向时),则它将无法生成有效的URL。
以下是可避免这两个问题的代码段:
<VirtualHost 192.0.2.1> ServerName www.example.dom ServerAdmin webgirl@example.dom DocumentRoot "/www/example" </VirtualHost>
考虑以下配置片段:
<VirtualHost www.example1.dom> ServerAdmin webgirl@example1.dom DocumentRoot "/www/example1" </VirtualHost> <VirtualHost www.example2.dom> ServerAdmin webguy@example2.dom 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的请求(包括所有用户以格式的URL键入的请求
http://www.example2.dom/whatever
)将全部由example1.dom
虚拟主机处理。为了更好地理解为什么会发生这种情况,需要更深入地讨论httpd如何将传入请求与将为其服务的虚拟主机进行匹配。提供了描述此内容的粗略文档。
基于名称的虚拟主机支持要求httpd知道httpd
正在运行的主机的IP地址。要获取此地址,它可以使用全局
ServerName
(如果存在)或调用C函数gethostname
(返回的函数应与在命令提示符下键入“主机名”相同)。然后,它在该地址上执行DNS查找。目前没有办法避免这种查找。
如果您担心此查询可能会由于DNS服务器已关闭而失败,则可以在/etc/hosts
其中插入主机名(您可能已经拥有该主机名,
以便计算机可以正常启动)。然后,确保将您的计算机配置为/etc/hosts
在DNS失败的情况下使用。根据您使用的操作系统,这可以通过编辑/etc/resolv.conf
或完成/etc/nsswitch.conf
。
如果您的服务器由于任何其他原因不必执行DNS,则可以通过将HOSTRESORDER
环境变量设置为“本地”的httpd运行。这完全取决于您使用的操作系统和解析器库。除非您mod_env
用来控制环境,否则它还会影响CGI
。最好查阅操作系统的手册页或常见问题解答。
VirtualHost
Listen
ServerName
<VirtualHost _default_:*>
没有页面可服务的服务器