VirtualHost指令
语法 <VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>
<VirtualHost>和</VirtualHost>用于封装一组仅作用于特定虚拟主机的指令。任何在虚拟主机配置中可以使用的指令也同样可以在这里使用。当服务器接受了一个特定虚拟主机的文档请求时,它会使用封装在<VirtualHost>配置段中的指令。Addr可以是:
虚拟主机的IP地址
虚拟主机IP地址对应的完整域名
字符"*",仅与"NameVirtualHost *"配合使用以匹配所有的IP地址
字符串"_default_",与基于IP的虚拟主机联用以捕获所有没有匹配的IP地址
示例
<VirtualHost 10.1.2.3>
ServerAdmin webmaster@host.foo.com
DocumentRoot /www/docs/host.foo.com
ServerName host.foo.com
ErrorLog logs/host.foo.com-error_log
TransferLog logs/host.foo.com-access_log
</VirtualHost>
IPv6的地址必须放入方括号中指定,否则作为可选项的端口号将无法确定。一个IPv6的示例如下:
<VirtualHost [2001:db8::a00:20ff:fea7:ccea]>
ServerAdmin webmaster@host.example.com
DocumentRoot /www/docs/host.example.com
ServerName host.example.com
ErrorLog logs/host.example.com-error_log
TransferLog logs/host.example.com-access_log
</VirtualHost>
<VirtualHost>的使用并不影响Apache的监听地址。你需要使用Listen来确保Apache正在监听正确的地址。
另外VirtualHost的地址和端口,必须在主服务的监听范围里面,如果你设置的虚拟主机端口是88,但是主服务程序只监听了81和82端口,那么这个设置无效的。
例子,我的配置中
Listen 80
Listen 81
<VirtualHost 192.168.1.101>
ServerAdmin liyixing1@gmail.com
DocumentRoot E:/www
ServerName liyixing.com
ErrorLog logs/liyixing.com-error_log
TransferLog logs/liyixing.com-access_log
</VirtualHost>
如上监听了两个端口,并且使用了一个虚拟服务器的配置,
http://127.0.0.1/
和http://127.0.0.1:81/
是一样的效果。
而访问地址
http://192.168.1.101/index.html
将进入到虚拟主机上面,这个时候访问的结果是403,所以要看结果从界面是看不出什么的,而应该看
logs/liyixing.com-error_log
和
logs/liyixing.com-access_log
可以发现这个时候请求发送到这个虚拟主机来了。
如果你需要在页面看出区别,则需要把虚拟主机的配置改成
<VirtualHost 192.168.1.101>
ServerAdmin liyixing1@gmail.com
DocumentRoot E:/www
ServerName liyixing.com
ErrorLog logs/liyixing.com-error_log
TransferLog logs/liyixing.com-access_log
Alias /www "E:/www"
<Directory "E:/www">
Options Indexes FollowSymLinks
AllowOverride None
Order deny,allow
allow from all
</Directory>
</VirtualHost>
这样开启查看权限才行。
如果这么配置同时也能通过
http://192.168.1.101/www/
来访问,因为这个时候已经同时开启了一个/www的访问
如果你希望只能通过
http://192.168.1.101
而http://192.168.1.101/www/无效的话,则需要把
Alias /www "E:/www"
这句去掉,也就是改成
<VirtualHost 192.168.1.101>
ServerAdmin liyixing1@gmail.com
DocumentRoot E:/www
ServerName liyixing.com
ErrorLog logs/liyixing.com-error_log
TransferLog logs/liyixing.com-access_log
<Directory "E:/www">
Options Indexes FollowSymLinks
AllowOverride None
Order deny,allow
allow from all
</Directory>
</VirtualHost>
另外这里的
Directory 可以配置在外部,而不是VirtualHost 内部
也就是
<Directory "E:/www">
Options Indexes FollowSymLinks
AllowOverride None
Order deny,allow
allow from all
</Directory>
<VirtualHost 192.168.1.101>
ServerAdmin liyixing1@gmail.com
DocumentRoot E:/www
ServerName liyixing.com
ErrorLog logs/liyixing.com-error_log
TransferLog logs/liyixing.com-access_log
</VirtualHost>
也是可以的,之所以放在VirtualHost 是为了和VirtualHost 主机和目录之间一一对应,来做统一的管理。
NameVirtualHost指令是基于主机名的虚拟主机的基础。如
NameVirtualHost 192.168.1.101
加上该指令,表示通过192.168.1.101这个IP访问到apache的话,那么将会检查Ip+客户端发送过来的请求中的Host头信息。否则,apache是不会检查Host头信息,而只会检查ip,来查找虚拟主机。
<VirtualHost 192.168.1.101>#NameVirtualHost和VirtualHost 可以使用*来表示所有apache监听的IP(只是IP,不包含域名)都将处理。apache建议这里使用的是IP而不是域名。因为如果基于域名,那么就可能出现盗链了。比如正常情况下
<VirtualHost www.test1.com> 中www.test1.com的IP是111.111.111.1
和
<VirtualHost www.test2.com>www.test2.com的IP是111.111.111.2
两个虚拟主机。Apache在启动的时候,会解析这两个域名。得到的结果将是111.111.111.1
和111.111.111.2,那么只有通过111.111.111.2发送过来的请求,才会进入第二个虚拟主机。但是www.test1.com的主人故意将IP指向了111.111.111.2,由于两个域名都指向同一个IP,那么第一个有效,也就是说通过www.test2.com访问到的虚拟主机进入到了www.test1.com的网站了。于是test1就得到了流量。
ServerAdmin liyixing1@gmail.com #这个信息不是很重要,这是当服务器发送错误,如请求的路径不存在,会在生成的页面生成一个连接到这个email的链接标签。另外也可以写一个url,生成的链接标签将直接访问到这个url。
DocumentRoot E:/www
ServerName localhost_test1.com #主机名。这个当开启了Host,也就是基于主机名的服务时,apache会对多个相同IP的虚拟主机中ServerName和客户端发送过来的Host对比,相同就有效。发现相同后面的虚拟主机就不会对比了。一般情况下,这个不写,Apache会通过反向解析出域名。但是如果当前环境下无法解析出这个虚拟主机IP对应的域名,那么就可能无法启动,因此建议,不管如何都给予一个主机名,而不是让Apache来反向解析出主机名。
ServerAlias localhost_test3.com #和ServerName类似,这里可以定义多个域名,使用空格分割,那么就可以通过多个域名访问到这个虚拟主机了。如我通过
Localhost_test1.com和localehost_test3.com都将进入到这个虚拟主机了。
ErrorLog logs/liyixing1.com-error_log
TransferLog logs/liyixing1.com-access_log
</VirtualHost>
<VirtualHost 192.168.1.101>
ServerAdmin liyixing2@gmail.com
DocumentRoot E:/wwww
ServerName localhost_test2.com
ServerAlias localhost_test4.com
ErrorLog logs/liyixing.com2-error_log
TransferLog logs/liyixing.com2-access_log
</VirtualHost>
如上两个虚拟主机,我配置了host文件,那么通过
localhost_test1.com和localhost_test3.com进入的是第一个虚拟主机
localhost_test2.com 和localhost_test4.com进入的是第二个虚拟主机。
语法 <VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>
<VirtualHost>和</VirtualHost>用于封装一组仅作用于特定虚拟主机的指令。任何在虚拟主机配置中可以使用的指令也同样可以在这里使用。当服务器接受了一个特定虚拟主机的文档请求时,它会使用封装在<VirtualHost>配置段中的指令。Addr可以是:
虚拟主机的IP地址
虚拟主机IP地址对应的完整域名
字符"*",仅与"NameVirtualHost *"配合使用以匹配所有的IP地址
字符串"_default_",与基于IP的虚拟主机联用以捕获所有没有匹配的IP地址
示例
<VirtualHost 10.1.2.3>
ServerAdmin webmaster@host.foo.com
DocumentRoot /www/docs/host.foo.com
ServerName host.foo.com
ErrorLog logs/host.foo.com-error_log
TransferLog logs/host.foo.com-access_log
</VirtualHost>
IPv6的地址必须放入方括号中指定,否则作为可选项的端口号将无法确定。一个IPv6的示例如下:
<VirtualHost [2001:db8::a00:20ff:fea7:ccea]>
ServerAdmin webmaster@host.example.com
DocumentRoot /www/docs/host.example.com
ServerName host.example.com
ErrorLog logs/host.example.com-error_log
TransferLog logs/host.example.com-access_log
</VirtualHost>
<VirtualHost>的使用并不影响Apache的监听地址。你需要使用Listen来确保Apache正在监听正确的地址。
另外VirtualHost的地址和端口,必须在主服务的监听范围里面,如果你设置的虚拟主机端口是88,但是主服务程序只监听了81和82端口,那么这个设置无效的。
例子,我的配置中
Listen 80
Listen 81
<VirtualHost 192.168.1.101>
ServerAdmin liyixing1@gmail.com
DocumentRoot E:/www
ServerName liyixing.com
ErrorLog logs/liyixing.com-error_log
TransferLog logs/liyixing.com-access_log
</VirtualHost>
如上监听了两个端口,并且使用了一个虚拟服务器的配置,
http://127.0.0.1/
和http://127.0.0.1:81/
是一样的效果。
而访问地址
http://192.168.1.101/index.html
将进入到虚拟主机上面,这个时候访问的结果是403,所以要看结果从界面是看不出什么的,而应该看
logs/liyixing.com-error_log
和
logs/liyixing.com-access_log
可以发现这个时候请求发送到这个虚拟主机来了。
如果你需要在页面看出区别,则需要把虚拟主机的配置改成
<VirtualHost 192.168.1.101>
ServerAdmin liyixing1@gmail.com
DocumentRoot E:/www
ServerName liyixing.com
ErrorLog logs/liyixing.com-error_log
TransferLog logs/liyixing.com-access_log
Alias /www "E:/www"
<Directory "E:/www">
Options Indexes FollowSymLinks
AllowOverride None
Order deny,allow
allow from all
</Directory>
</VirtualHost>
这样开启查看权限才行。
如果这么配置同时也能通过
http://192.168.1.101/www/
来访问,因为这个时候已经同时开启了一个/www的访问
如果你希望只能通过
http://192.168.1.101
而http://192.168.1.101/www/无效的话,则需要把
Alias /www "E:/www"
这句去掉,也就是改成
<VirtualHost 192.168.1.101>
ServerAdmin liyixing1@gmail.com
DocumentRoot E:/www
ServerName liyixing.com
ErrorLog logs/liyixing.com-error_log
TransferLog logs/liyixing.com-access_log
<Directory "E:/www">
Options Indexes FollowSymLinks
AllowOverride None
Order deny,allow
allow from all
</Directory>
</VirtualHost>
另外这里的
Directory 可以配置在外部,而不是VirtualHost 内部
也就是
<Directory "E:/www">
Options Indexes FollowSymLinks
AllowOverride None
Order deny,allow
allow from all
</Directory>
<VirtualHost 192.168.1.101>
ServerAdmin liyixing1@gmail.com
DocumentRoot E:/www
ServerName liyixing.com
ErrorLog logs/liyixing.com-error_log
TransferLog logs/liyixing.com-access_log
</VirtualHost>
也是可以的,之所以放在VirtualHost 是为了和VirtualHost 主机和目录之间一一对应,来做统一的管理。
NameVirtualHost指令是基于主机名的虚拟主机的基础。如
NameVirtualHost 192.168.1.101
加上该指令,表示通过192.168.1.101这个IP访问到apache的话,那么将会检查Ip+客户端发送过来的请求中的Host头信息。否则,apache是不会检查Host头信息,而只会检查ip,来查找虚拟主机。
<VirtualHost 192.168.1.101>#NameVirtualHost和VirtualHost 可以使用*来表示所有apache监听的IP(只是IP,不包含域名)都将处理。apache建议这里使用的是IP而不是域名。因为如果基于域名,那么就可能出现盗链了。比如正常情况下
<VirtualHost www.test1.com> 中www.test1.com的IP是111.111.111.1
和
<VirtualHost www.test2.com>www.test2.com的IP是111.111.111.2
两个虚拟主机。Apache在启动的时候,会解析这两个域名。得到的结果将是111.111.111.1
和111.111.111.2,那么只有通过111.111.111.2发送过来的请求,才会进入第二个虚拟主机。但是www.test1.com的主人故意将IP指向了111.111.111.2,由于两个域名都指向同一个IP,那么第一个有效,也就是说通过www.test2.com访问到的虚拟主机进入到了www.test1.com的网站了。于是test1就得到了流量。
ServerAdmin liyixing1@gmail.com #这个信息不是很重要,这是当服务器发送错误,如请求的路径不存在,会在生成的页面生成一个连接到这个email的链接标签。另外也可以写一个url,生成的链接标签将直接访问到这个url。
DocumentRoot E:/www
ServerName localhost_test1.com #主机名。这个当开启了Host,也就是基于主机名的服务时,apache会对多个相同IP的虚拟主机中ServerName和客户端发送过来的Host对比,相同就有效。发现相同后面的虚拟主机就不会对比了。一般情况下,这个不写,Apache会通过反向解析出域名。但是如果当前环境下无法解析出这个虚拟主机IP对应的域名,那么就可能无法启动,因此建议,不管如何都给予一个主机名,而不是让Apache来反向解析出主机名。
ServerAlias localhost_test3.com #和ServerName类似,这里可以定义多个域名,使用空格分割,那么就可以通过多个域名访问到这个虚拟主机了。如我通过
Localhost_test1.com和localehost_test3.com都将进入到这个虚拟主机了。
ErrorLog logs/liyixing1.com-error_log
TransferLog logs/liyixing1.com-access_log
</VirtualHost>
<VirtualHost 192.168.1.101>
ServerAdmin liyixing2@gmail.com
DocumentRoot E:/wwww
ServerName localhost_test2.com
ServerAlias localhost_test4.com
ErrorLog logs/liyixing.com2-error_log
TransferLog logs/liyixing.com2-access_log
</VirtualHost>
如上两个虚拟主机,我配置了host文件,那么通过
localhost_test1.com和localhost_test3.com进入的是第一个虚拟主机
localhost_test2.com 和localhost_test4.com进入的是第二个虚拟主机。