Preface
在浏览本文之前,请保证已经安装好Apache HTTP Server。
Environment
OS: Windows XP
Web Server: Apache HTTP Server 2.2.4
Introduction
本文主要讲述在Apache HTTP Server上如何设置Virtual Host(虚拟主机),使得同一IP通过不同域名访问可以访问到Server上的不同站点。
Section 1 - Requirement:
如果通过正常的IP只能仅仅访问Host上的一个Website的话,Resource将会大量浪费。例如你正用自己的Host来跑一个WordPress的Blog System,同时你也想打算用同一台Host来跑一个C2C的System,Host的IP只有一个,如何让两种不同的visitor通过同一IP访问到两个不同的System呢?这就需要我们在Server上通过设置Virtual Host(虚拟主机)来实现。
Section 2 - Solution:
(1) 首先refer以下这个Website:
http://httpd.apache.org/docs/2.2/vhosts/
大概了解一下Virtual Host的原理以及相关的设置步骤。实际上offical的document已经写得很到位,请细心琢磨。
(2) 如果你利用Apache2.2/conf/extra/httpd-vhosts.conf来进行设置,必须记得要把httpd.conf中Include conf/extra/httpd-vhosts.conf前的#号去掉,使其生效。
(3) 你很可能会遇到403 Forbidden的问题,因为在httpd.conf中有如下directives
- <Directory />
- Options FollowSymLinks
- AllowOverride None
- Order deny,allow
- Deny from all
- Satisfy all
- </Directory>
Deny from all就是引致问题的元凶,但是我们这里就不去修改httpd.conf中的这段。因为我们可以针对不同的Virtual Host上设置不同的访问权限,具体步骤请看下一段。
(4) 为了更清晰地说明问题,所以举一具体例子说明。现在打算设置两台Virtual Host,使得visitor可以通过evilkiller.com这个域名来访问"E:/Project/wordpress"目录下的Blog System,通过evilkiller.net这个域名来访问"E:/Project/c2c"目录下的C2C System。首先打开httpd-vhosts.conf,根据已有的两个默认范例修改成如下代码。第一台VH实际上是本人用于作默认指向,www.default.com只是虚名,当visitor通过IP或者其它非本人指定的域名访问我的Host的时候,将其转向本人设定的默认Website,即在"D:/Apache Software Foundation/Apache2.2/htdocs"这个目录下的Website,非关键可省略。而关键的两台HV其实就如下一样简单,对DocumentRoot(Website存放的位置)和ServerName(所用域名)进行设置就可以了,而Directory段就是用于权限控制的,关于deny和allow的order问题以及安全性问题就不在这里讨论了,总之将之前的Deny from all改成Allow from all就不会遇到403 Forbidden问题了。另外*号代表Sever接受通过任何IP地址对Host的访问,主要是针对部分使用Dynamic IP的Host。
- <VirtualHost *:80>
- # ServerAdmin webmaster@dummy-host.evilkiller.com
- DocumentRoot "D:/Apache Software Foundation/Apache2.2/htdocs"
- ServerName www.default.com
- <Directory />
- Options FollowSymLinks
- AllowOverride None
- Order allow,deny
- Allow from all
- Satisfy all
- </Directory>
- # ServerAlias www.dummy-host.evilkiller.com
- # ErrorLog logs/dummy-host.evilkiller.com-error_log
- # CustomLog logs/dummy-host.evilkiller.com-access_log common
- </VirtualHost>
- <VirtualHost *:80>
- # ServerAdmin webmaster@dummy-host.evilkiller.com
- DocumentRoot "E:/Project/wordpress"
- ServerName evilkiller.com
- <Directory />
- Options FollowSymLinks
- AllowOverride None
- Order allow,deny
- Allow from all
- Satisfy all
- </Directory>
- # ServerAlias www.dummy-host.evilkiller.com
- # ErrorLog logs/dummy-host.evilkiller.com-error_log
- # CustomLog logs/dummy-host.evilkiller.com-access_log common
- </VirtualHost>
- <VirtualHost *:80>
- # ServerAdmin webmaster@dummy-host2.evilkiller.com
- DocumentRoot "E:/Project/c2c"
- ServerName evilkiller.net
- <Directory />
- Options FollowSymLinks
- AllowOverride None
- Order allow,deny
- Allow from all
- Satisfy all
- </Directory>
- # ErrorLog logs/dummy-host2.evilkiller.com-error_log
- # CustomLog logs/dummy-host2.evilkiller.com-access_log common
- </VirtualHost>
PS:如有漏洞或者问题请在这里提出,方便进行探讨。