常用基础 - 虚拟主机

  • 作者:KK

  • 发表日期:2017.02.13


如果是新手,可以暂时理解为“一个网站就是一个虚拟主机”,一台服务器上是可以运行多个网站的,所以也就是能建立多个虚拟主机

添加虚拟主机

建立虚拟主机的办法就是在配置文件里面添加特定指令,基本的配置如下:

<VirtualHost *:80>
	ServerName test
	DocumentRoot D:\web\test
</VirtualHost>

ServerName指令设置主机名(相当于域名),DocumentRoot设置主机目录

要重启服务器才能生效


设置DNS解析

光是上面添加了配置还不能满足测试,一般大家测试都是用Windows系统的吧,那就用记事本打开C:\Windows\system32\drivers\etc\hosts这个文件,在后面添加一行内容:

127.0.0.1 test

并保存即可,如果保存失败,请上网搜索“Windows修改hosts无法保存”找答案

如果是Linux系统就是修改/etc/hosts这个文件

然后浏览器输入http://test就能访问这个主机下的index.html页面了

  • 解释

    向hosts文件添加127.0.0.1 test的意思可以理解为“告诉操作系统,如果有请求test这个域名的,那就别跑到外网去找,而是回到本机来找”(127.0.0.1是一个回路IP,指向本机)

    然后本机又开着Apache服务器监听test这个主机的请求,所以就把数据响应给了浏览器,浏览器就能显示出结果了


主机名的概念

我也没读过什么国际文献,总结多年来接触各类文档和代码,了解到主机名是这样的一种东西:

http://www.kkh86.com/it/index.html 这个网址里的www.kkh86.com这个片段叫做主机名,在许多软件配置、代码里的专业名词是host或者domain,更多是用hosthostname来命名

kkh86.com是一个域名,腾讯的域名是qq.com,百度的域名是baidu.tom,然后域名又分二级域名(如qzone.qq.com),三级域名……

但无论域名多少级,它们都是一个主机名,就像无论儿童、青少年、年轻人、中老年人,大家都是“人类”一样

一个网址的构成部分可以有:协议名称://主机名:端口/目录/子目录/文件.html?queryString#锚点名称


可以配置多个虚拟主机

下面这样就是配置两个虚拟主机:

<VirtualHost *:80>
	ServerName test1
	DocumentRoot D:\web\test1
</VirtualHost>

<VirtualHost *:80>
	ServerName test2
	DocumentRoot D:\web\test2
</VirtualHost>

通常都将虚拟主机独立成一个配置文件

通常你可以看见别人的服务器都将所有VirtualHost配置段(虚拟主机)的配置都写到一个httpd-vhost.conf的文件里,然后在httpd.conf里配置了这条指令:

Include conf/httpd-vhost.conf

以后改虚拟主机专门去httpd-vhost.conf里改


也有一些做法是建立vhosts目录,里面每个文件是一个主机

在conf目录下再创一个vhosts目录,在这里会有一些类似这样的文件:

www.aaa.com.conf
www.bbb.com.cn.conf
iq.ccc.org.conf

然后在httpd.conf里的指令就是Include conf/vhosts/*.conf表示引入vhosts目录里的所有conf文件

而vhosts里每个文件就是一个主机的配置(在普通程序员的概念里就是一个网站主机配置)


主机别名

一个主机可以拥有多个主机名,也就能实现多个域名访问同一个主机

办法就是通过ServerAlias指令为主机设置别名:

<VirtualHost *:80>
	ServerName www.test.com
	ServerAlias test.com
	DocumentRoot D:\web\test
</VirtualHost>

这样就能用http://www.test.comhttp://test.com两个网址访问D:\web\test上的网页文件了嘛

  • 来来来,有个小秘密。。。我一般不告诉别人,就是我们还能添加更多别名呢:

    <VirtualHost *:80>
    	ServerName www.test.com
    	ServerAlias test.com test2.com test3.com
    	DocumentRoot D:\web\test
    </VirtualHost>
    

主机目录索引

如果说http://test/a.html是访问test主机目录下的a.html文件的话,那么http://test到底是访问哪个文件呢?

根据经验总结,如果只有主机名,没有文件名,默认就是访问“index.html”,但别得意,默认情况下是这样,如果配置特殊,不是你所想的那样

默认访问的文件叫做索引文件,像打开一本笑话书,你不知看哪一篇,那默认就先看索引目录一样

网址里不声明文件名,则Apache也要知道给你一个索引文件,index.html当然是经典中的经典

其实我们能通过DirectoryIndex指令来定义多个索引文件:

<VirtualHost *:80>
	ServerName test
	DocumentRoot D:\web\test
	
	#看这里啊亲!!
	DirectoryIndex index.html index.htm index.php
</VirtualHost>

以上是很典型的索引文件定义(通常就是默认配置),如果URL上没有指定文件,那么优先看看这个目录下有没有index.html,若没有就再找找index.htm,最后才找index.php

这个优先级是从左到右的,自己调整即可

比如我们还可以这样改:

DirectoryIndex i.html i2.html cgi.php

自己玩玩吧


何时会使用索引

其实并不是单纯的在网站根目录下才会用索引的,比如http://test的确会默认找主机目录下的index.html,也就是/index.html

如果网址是http://test/user并且user目录又存在的话,这也是没有指定文件名,只是精确到了目录,此时也符合未指定文件名的条件,触发索引文件的查找,也会默认查找/user/index.html

只要将DirectoryIndex指令放在VirtualHost配置段里,默认对主机目录里面所有子目录都会生效

  • 提示:其实DirectoryIndex指令还能用在其它地方,后面会提到

常见的PHP主机配置

直接复制修改测试或部署

<VirtualHost *:80>
	ServerName test
	DocumentRoot "D:\test"
	DirectoryIndex index.html index.htm index.php
	Options FollowSymLinks ExecCGI
	<Directory "G:\kkdoc\projects\xoa\web\home">
		AllowOverride All
		Allow from all
		Order allow,deny
	</Directory>
</VirtualHost>

逐一说明主要的含义:

<VirtualHost *:80>
	#主机名
	ServerName test

	#主机目录
	DocumentRoot "D:\test"

	#目录索引
	DirectoryIndex index.html index.htm index.php

	#开启特性:FollowSymLinks我暂时也不懂得如何解释它~没试出效果;ExecCGI是允许执行cgi程序,比如PHP或ASP什么的
	Options FollowSymLinks ExecCGI

	#Directory配置段用于定义目录内的设置
	<Directory "G:\kkdoc\projects\xoa\web\home">
		#允许.htaccess使用所有重写规则指令
		AllowOverride All

		#允许来自所有主机的请求,你理解为所有地方就好了
		Allow from all

		#比如只允许来自指定域名或IP
		#Allow from 192.168.1.101

		#如果不符合上面Allow指令的设定 或者 符合Deny指令的设定(但这里没有声明Deny),那都禁止访问该主机
		Order allow,deny
	</Directory>
</VirtualHost>