http报文头部包含了请求方法,请求的资源等信息,但是对于Host字段一直觉得可有可无,因为我所认为的Host的字段的作用在于指明http报文的方向,访问的地点,但是实际报文转发都是由底层目的端口IP决定了,所以觉得Host字段没有用。
问题
问题在于当我写的一个socket代理上,我的目的是把所有请求的报文全部重定向到一个固定的IP和端口上,想法很简单,接收请求,新建socket,连接到固定IP和端口,转发请求。结果报错:
socket.error: [Errno 104] Connection reset by peer
这个错误一般出在C/S模式中一方数据还在等待,一方却关闭了连接。我把重定向取消,即连接到原先请求想要请求的网址,程序正常运行。那么问题出在哪?
原因
前面讲了,就是http请求头的问题,http请求头第一行指明请求资源,若是没有该资源,会返回一个错误页面,但是起码是有返回信息的。但是如果Host这个字段错误,服务端就会丢弃这个连接,而客户端还在等待接收,这样就会报错。那么Host字段的作用是什么。
Host字段
我们知道,不同的域名通过A记录或者CNAME方式可以连接都同一个IP下,同一个IP也可以设置多个不同站点,那我访问不同的域名都转发到同一IP,怎么区分这些不同的站点呢,就是用的Host字段,如果服务器后台解析出Host但是服务器上找不到相应的站点,那么这个连接很可能会被丢弃,从而报错。
我在程序当中将Host修改成
Host: www.baidu.com
再将请求的资源路径修改成“/”,socket定向到百度的IP,访问成功百度首页,且不会报错。
总结
小错误,却花了点时间解决,mark一下。