常用基础 - 默认主机 ¶
作者:KK
发表日期:2017.2.11
声明
本文章主要通过
ServerName
和DocumentRoot
指令来实现“默认主机”。但我并没有看到官方文档这些解析为“默认主机”这个概念仅仅是我个人的经验总结,其实我们可以暂时放下官方那些对于菜鸟难以理解的术语,试一试这些效果,起码知道作用就好了
1.主机or网站 的概念 ¶
用我们通俗的思维来理解,一个主机就是一个网站,因为以往我们经常配置主机就是为了运行网站
不过一旦这服务器的输出是为了给APP什么的提供数据,你还能说这上面跑的是网站吗?
所以还是叫主机吧,而一般的http服务器(如Apache、Nginx、Tomcat等)都能同时设定多个主机同时运作
2.ServerName和DocumentRoot指令 ¶
刚安装好的Apache应该是注释了这个指令的,我们一般将它设为如下内容
ServerName 127.0.0.1
#这样写更安全,不解释
ServerName 127.0.0.1:80
如果刚开始没有设置<VirtualHost>
这个配置段来定义其它主机,那么在浏览器上直接访问http://127.0.0.1也会输出网页
这些网页内容一般是来源于服务器上的一个目录,这个目录的路径是由DocumentRoot
指令设定的,搜索一下DocumentRoot指令,会有大概这样的内容:
#Windows下的配置
DocumentRoot "D:\phpStudy\WWW"
DocumentRoot "D:\wamp\WWW"
#Linux下的配置
DocumentRoot /usr/local/apache/htdocs
然后去到相关的目录也能找到对应输出的网页文件
顺带一提,如果不指定ServerName的话,服务器会无法启动,DocumentRoot虽然可以不指定,但访问时会提示404找不到页面
3.为何是默认主机 ¶
其实我们可以用<VirtualHost>
配置段来定义更多主机嘛,虽然本节不是专门讲VirtualHost的,但可以先粘贴以下配置先弄多几个主机
<VirtualHost *:80>
ServerName test1
DocumentRoot D:\web\test1
</VirtualHost>
<VirtualHost *:80>
ServerName test2
DocumentRoot D:\web\test2
</VirtualHost>
以上配置涉及到的D:\web\test1这样的测试目录要你自己创建一下哦,并且在里面放一个有点内容的index.html
提醒菜鸟(毕竟也接触过一些职场新人不懂这块的)
如果用Windows做测试,还要在
C:\Windows\system32\driver\etc\hosts
里添加以下两行内容:127.0.0.1 test1 127.0.0.1 test2
如果用Linux测试就在
/etc/hosts
里加暂不解释
配置好重启Apache后,浏览器访问http://127.0.0.1会显示D:\web\test1里面的网页文件
也就是说显示了第一个VirtualHost配置段里的主机目录里的网页,并没有显示外面的
再访问http://test2会显示D:\web\test2里的index.html
访问http://test1会显示D:\web\test1里的index.html
所以外面的ServerName和DocumentRoot我们可以理解为“在没有VirtualHost配置时,访问服务器所识别的主机和返回网页的目录”
重要知识点
以上测试可以了解到,虽然test1和test2各有指定的目录,但访问http://127.0.0.1的时候,并没有指定test1或test2,服务器会默认返回第一个VirtualHost里的主机网页
甚至你再在hosts文件里增加
127.0.0.1 test3
,但不要在Apache配置里创建test3的主机,然后访问http://test3也会返回test1的网页
4.通常外面的ServerName和DocumentRoot都不会生效 ¶
实际上工程师通常都会设置VirtualHost配置段来定义主机
所以导致服务器收到http请求时,服务器优先匹配了VirtualHost里的主机并返回相应的HTML
而外面的ServerName和DocumentRoot就不会被匹配并返回里面的网页
那还要保留外面的ServerName和DocumentRoot吗?————答案是要的,必须有这个配置,不然服务器启动不来嘛,至少要有ServerName