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

2020-04-14 21:02:51 +08:00
 zxCoder

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

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

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

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

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

5000 次点击
所在节点    问与答
14 条回复
Telegram
2020-04-14 21:08:14 +08:00
虚拟主机,一个 IP 上成百上千个网站,但是 http 服务,默认都是 80 端口。
没有 host,服务端怎么知道你到底访问的是哪个网站。。。

你自己说的也有道理,但是你不能让每个网站都是独立端口吧??
aaa.com:8081
bbb.com:8082
这种带端口访问,你不觉得丑吗
Morge
2020-04-14 21:26:00 +08:00
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.
Morge
2020-04-14 21:29:16 +08:00
详情请见 RFC7230 第 5.4 节
liuxey
2020-04-14 21:37:12 +08:00
参考 Nginx 可以根据不同的 Host 在同一端口 serve 不同的网站内容

http://nginx.org/en/docs/http/server_names.html
heyjei
2020-04-14 21:48:27 +08:00
首先你要懂得网络分层的原理,在我们 TCP/IP 网络模型中,分四层:物理层、网络层、传输层、应用层。

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

应用层:
这里应用层的协议是 HTTP 或者 HTTPS,应用层的数据是通过 TCP 连接传输过去的。WEB 服务器收到 HTTP 协议的数据后,就会解析 Host 头部信息,判断这个 HTTP 请求应该让谁来处理(在我们这里是访问对应域名的网站 /虚拟主机)。
elfive
2020-04-14 21:54:37 +08:00
@heyjei host 是纯的应用层的东西,和你那几个层完全不相关。
它就是一楼所说的,虚拟主机。是 HTTP1.1 版本提出来的东西,是 HTTP1.1 版本之后协议规定所必须要添加的内容。
dandycheung
2020-04-14 22:01:50 +08:00
你最后理解的就对。
liuzhiyong
2020-04-14 23:03:12 +08:00
你说的“同一个 ip 和同一个端口号,部署不同的网站”就是正确答案。
dobelee
2020-04-14 23:43:34 +08:00
一看楼主就暴露年龄了,十几年前云主机还不流行,都是虚拟主机的天下,很多人共用一个 IP,就靠 host 绑定域名来路由。
shansing
2020-04-15 00:01:41 +08:00
你的理解是对的,网上的说法也没错,就是有点误导。它假设一台服务器上部署着谷歌、百度、淘宝的网站,还用域名 www.google.com 举例子,我们知道基本不符合现实。
另外要注意的是,确实(一部分)网址会解析成“解析成 ip:端口”,但当你不(显式)指定端口的时候,总是默认端口,即 80 ( HTTP )或 443 ( HTTPS )。
shansing
2020-04-15 00:02:44 +08:00
@shansing (一部分)网址 → 网址(的一部分)
saluton
2020-04-15 02:03:26 +08:00
@dobelee H 球空间了解一下(想了半天才想起这个名字
msg7086
2020-04-15 05:39:52 +08:00
> 我们发送一个请求不是最后都被解析成 ip:端口

当然不是。你的请求就是你的请求,发出去是什么样,别人收到就是什么样。ip 只是从域名做解析,和你报文里写的内容是无关的。
ltfree
2020-12-07 10:39:33 +08:00
@dobelee 那时候不用 nginx 么..感觉 nginx 能完全代替这玩意吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662419

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX