常用基础 - 默认主机

  • 作者:KK

  • 发表日期:2017.2.11


  • 声明

    本文章主要通过ServerNameDocumentRoot指令来实现“默认主机”。但我并没有看到官方文档这些解析为“默认主机”这个概念

    仅仅是我个人的经验总结,其实我们可以暂时放下官方那些对于菜鸟难以理解的术语,试一试这些效果,起码知道作用就好了


1.主机or网站 的概念

用我们通俗的思维来理解,一个主机就是一个网站,因为以往我们经常配置主机就是为了运行网站

不过一旦这服务器的输出是为了给APP什么的提供数据,你还能说这上面跑的是网站吗?

所以还是叫主机吧,而一般的http服务器(如Apache、Nginx、Tomcat等)都能同时设定多个主机同时运作


2.ServerNameDocumentRoot指令

刚安装好的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