HTTP中的Host字段

    说白了,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服务器,我的理解就是实现负载均衡。

    搭建了自己的博客网站,欢迎来访 www.ditanshow.com

### HTTP Header Fields 的正确描述 #### Cookie 字段 `Cookie` 是一种用于客户端存储少量数据并将其发送回服务器的机制。通过 `Set-Cookie` 响应头,服务器可以设置一个或多个 cookies,在后续请求中,浏览器会自动将这些 cookies 发送到对应的域和路径下[^1]。 除了名称-值对之外,服务器还可以定义其他属性来控制 cookie 的行为,例如: - **Domain**: 定义哪些子域名能够接收该 cookie。 - **Path**: 限定 cookie 只能被特定路径下的资源访问。 - **Expires/Max-Age**: 设置 cookie 的过期时间或者最大存活周期。 - **Secure Flag**: 表明此 cookie 应仅通过 HTTPS 协议传输。 - **HttpOnly Flag**: 防止 JavaScript 访问该 cookie,从而减少 XSS 攻击的风险。 需要注意的是,当浏览器向服务器发送请求时,它只会传递 cookie 的名称-值对,而不会包含上述任何附加属性。这些属性仅供浏览器内部使用,帮助决定如何处理 cookie(如删除、阻止或发送给服务器)。因此,实际通信中的 `Cookie` 头部只包含一系列键值对形式的数据。 #### Host 字段 `Host` 请求头部是一个强制性的字段,用来指定目标主机名以及可选端口号。它的主要作用在于支持虚拟托管服务——即在同一 IP 地址上运行多个网站。通过解析 `Host` 中的信息,Web 服务器能够区分不同的站点并将用户的请求路由到正确的应用实例上去。 例如,在发出 GET 请求至 https://example.com/resource?query=string 这样的 URL 时,相应的 `Host` 头应该是: ```http GET /resource?query=string HTTP/1.1 Host: example.com ``` 如果没有提供显式的端口,则默认采用标准端口(80 对于 HTTP 和 443 对于 HTTPS)。如果指定了非标准端口,则需连同其一起写入 `Host` 字段之中,形如 `example.com:8080`[^2]。 尽管这里讨论的内容涉及到了 ICMP Redirect Messages 的配置选项等内容,但它并不直接影响我们对于 HTTP Headers 如何工作的理解;这部分更偏向操作系统层面网络参数调整方面的话题。 综上所述,HTTP headers like 'Cookie' and 'Host', play crucial roles within client-server communications over web protocols. ```python import http.client conn = http.client.HTTPSConnection("example.com", port=443) headers = { 'Host': 'example.com', 'Cookie': 'session_id=abc123; user_lang=en' } conn.request("GET", "/path/to/resource", headers=headers) response = conn.getresponse() print(response.status, response.reason) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值