http 报文的 host 字段是干啥用的

Host 是 HTTP 1.1 协议中新增的一个请求头,主要用来实现虚拟主机技术。

虚拟主机( virtual hosting )即共享主机( shared web hosting ),可以利用虚拟技术把一台完整的服务器分成若干个主机,因此可以在单一主机上运行多个网站或服务。

举个栗子,有一台 ip 地址为 61.135.169.125 的服务器,在这台服务器上部署着谷歌、百度、淘宝的网站。为什么我们访问 https://www.google.com 时,看到的是 Google 的首页而不是百度或者淘宝的首页?原因就是 Host 请求头决定着访问哪个虚拟主机。

网上说的这个说法对吗?我们发送一个请求不是最后都被解析成 ip:端口,这样不就能区分同一台机器的不同服务,为什么要这个 host 字段呢?谷歌也查过了,看不太懂这个的意思

我现在的理解是相当于可以同一个 ip 和同一个端口号,部署不同的网站这样子?

相关文章

12 thoughts on “http 报文的 host 字段是干啥用的

  1. 虚拟主机,一个 IP 上成百上千个网站,但是 http 服务,默认都是 80 端口。
    没有 host,服务端怎么知道你到底访问的是哪个网站。。。

    你自己说的也有道理,但是你不能让每个网站都是独立端口吧??
    aaa.com:8081
    bbb.com:8082
    这种带端口访问,你不觉得丑吗

  2. The “Host” header field in a request provides the host and port information from the target URI, enabling the origin server to distinguish among resources while servicing requests for multiple host names on a single IP address.

  3. 首先你要懂得网络分层的原理,在我们 TCP/IP 网络模型中,分四层:物理层、网络层、传输层、应用层。

    传输层:
    在我们这里传输层用的是 TCP 协议,如果浏览器要和服务器的 WEB 服务器通信,首先要在传输层上建立连接并传输数据,这里他们需要通过 IP:Port <–> IP:Port 这种四元组来定位对方的位置。这时候是没有域名的概念的,浏览器要和对方的服务器通信必须把域名通过 DNS 协议解析成 IP 地址;

    应用层:
    这里应用层的协议是 HTTP 或者 HTTPS,应用层的数据是通过 TCP 连接传输过去的。WEB 服务器收到 HTTP 协议的数据后,就会解析 Host 头部信息,判断这个 HTTP 请求应该让谁来处理(在我们这里是访问对应域名的网站 /虚拟主机)。

  4. @heyjei host 是纯的应用层的东西,和你那几个层完全不相关。
    它就是一楼所说的,虚拟主机。是 HTTP1.1 版本提出来的东西,是 HTTP1.1 版本之后协议规定所必须要添加的内容。

  5. 一看楼主就暴露年龄了,十几年前云主机还不流行,都是虚拟主机的天下,很多人共用一个 IP,就靠 host 绑定域名来路由。

  6. 你的理解是对的,网上的说法也没错,就是有点误导。它假设一台服务器上部署着谷歌、百度、淘宝的网站,还用域名 http://www.google.com 举例子,我们知道基本不符合现实。
    另外要注意的是,确实(一部分)网址会解析成“解析成 ip:端口”,但当你不(显式)指定端口的时候,总是默认端口,即 80 ( HTTP )或 443 ( HTTPS )。

  7. > 我们发送一个请求不是最后都被解析成 ip:端口

    当然不是。你的请求就是你的请求,发出去是什么样,别人收到就是什么样。ip 只是从域名做解析,和你报文里写的内容是无关的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注