常用基础 - 虚拟主机 ¶
作者: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
,更多是用host
或hostname
来命名
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.com和http://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>