HTTP中的Host字段

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangqi_gsts/article/details/50775341

    说白了,HTTP还是TCP协议,所以发起http请求也就是建立TCP连接并发送的过程,也就是说connect-->send。

    TCP在connect的时候必须要知道对方我IP地址和监听端口。比如我们要发起对www.baidu.com的请求,那第一步就是得到www.baidu.com对应的IP地址,然后connect,进而send。

    在http1.1中新增了一个Host头,那大家有没有想过Host的作用是什么。因为在connect的时候已经指定了IP,也就是说connect后已经知道主机了,那还用Host做什么。另外需要说明的是Host是1.1中才有的,Http1.1中如果没指定Host,则返回404。

    用curl做一个实验

curl -I "http://220.195.19.18/app/index.php?i=4&c=entry&p=designer&pageid=1&m=ewei_shop&do=plugin" -H "host: www.hao23.net" -v

        可以看到,服务器返回了200,表示成功。在这里通过-H 指定了host字段,在请求头中也确实看到了有host字段,而且可以看到确实Http1.1。再ping一下host

ping www.hao23.net

         能ping通host,那也就是说host确实存在。

    再看看curl时的那个URL,在URL指定了主机ip(220.195.19.18),再看上面ping的结果,www.hao23.net的ip为119.147.253.16,这是两个ip,换句话说在一个请求中出现了两个不同的主机IP,这是怎么回事?

curl -I "http://220.195.19.18/app/index.php?i=4&c=entry&p=designer&pageid=1&m=ewei_shop&do=plugin" -v

         当不用-H指定host时,curl会自动讲host字段填充为url中的主机(域名),但最后返回的却是404。

    再换一种方法,用-H中的host替换URL中的主机。

curl -I "http://www.hao23.net/app/index.php?i=4&c=entry&p=designer&pageid=1&m=ewei_shop&do=plugin" -v   


    我们将URL中的220.195.19.18替换成了-H中的www.hao23.net,发现最后的返回是200,也就说最后真正访问的主机是www.hao23.net。为什么会这样?

    猜想一下:这里出现了两个主机,一个较明显,一个较隐蔽,而真正访问的是教隐蔽的一个,感觉有点像总分结构————可以让所有的URL一样,但Host不同,可以根据不同的Host将同一个请求定向到不同发主机,从而达到分布均衡的效果。

    事实上,Host的存在就是为了实现虚拟WEB服务器,我的理解就是实现负载均衡。


猜你喜欢

转载自blog.csdn.net/zhangqi_gsts/article/details/50775341
今日推荐