HTTP中的Host字段
2016-03-01 21:11
495 查看
说白了,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做一个实验
![](http://img.blog.csdn.net/20160301211333173?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可以看到,服务器返回了200,表示成功。在这里通过-H 指定了host字段,在请求头中也确实看到了有host字段,而且可以看到确实Http1.1。再ping一下host
![](http://img.blog.csdn.net/20160301204254383?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
能ping通host,那也就是说host确实存在。
再看看curl时的那个URL,在URL指定了主机ip(220.195.19.18),再看上面ping的结果,www.hao23.net的ip为119.147.253.16,这是两个ip,换句话说在一个请求中出现了两个不同的主机IP,这是怎么回事?
![](http://img.blog.csdn.net/20160301211350314?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
当不用-H指定host时,curl会自动讲host字段填充为url中的主机(域名),但最后返回的却是404。
再换一种方法,用-H中的host替换URL中的主机。
![](http://img.blog.csdn.net/20160301205748586?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
我们将URL中的220.195.19.18替换成了-H中的www.hao23.net,发现最后的返回是200,也就说最后真正访问的主机是www.hao23.net。为什么会这样?
猜想一下:这里出现了两个主机,一个较明显,一个较隐蔽,而真正访问的是教隐蔽的一个,感觉有点像总分结构————可以让所有的URL一样,但Host不同,可以根据不同的Host将同一个请求定向到不同发主机,从而达到分布均衡的效果。
事实上,Host的存在就是为了实现虚拟WEB服务器,我的理解就是实现负载均衡。
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服务器,我的理解就是实现负载均衡。
相关文章推荐
- iOS网络数据安全
- 浏览器XMLHttpRequest案例
- 网络编程Study
- HTTP状态码大全
- JAVA的包装类 http://blog.csdn.net/hjf19790118/article/details/7081925
- TCP/IP基础(二)
- Java泛型的类型擦除 http://blog.csdn.net/hust_is_lcd/article/details/7875386
- 卷积神经网络用于视觉识别Convolutional Neural Networks for Visual Recognition
- 使用AsyncTask异步加载类进行访问网络数据json的理解和用法
- 关于安装Httpd Web服务器
- Java泛型-类型擦除 http://blog.csdn.net/caihaijiang/article/details/6403349
- [国嵌攻略][091][TCP网络程序设计]
- meta标签中的http-equiv属性使用介绍
- 透过ATS缓存配置看如何判断HTTP资源是否可缓存方法论
- linux网络文件系统挂载配置
- 2055: 80人环游世界|有上下界的费用流
- Libcurl中配置openssl使其支持https
- Android中相机调用及将照片存储sd 实例,转自:http://android.tgbus.com/Android/tutorial/201204/419574.shtml
- java多线程下载网络资源(支持断点续传)
- 【转】HTTP响应头信息和请求头信息详解