V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zxCoder
V2EX  ›  问与答

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

  •  
  •   zxCoder · 2020-04-14 21:02:51 +08:00 · 4971 次点击
    这是一个创建于 1676 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    14 条回复    2020-12-07 10:39:33 +08:00
    Telegram
        1
    Telegram  
       2020-04-14 21:08:14 +08:00   ❤️ 1
    虚拟主机,一个 IP 上成百上千个网站,但是 http 服务,默认都是 80 端口。
    没有 host,服务端怎么知道你到底访问的是哪个网站。。。

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

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

    当然不是。你的请求就是你的请求,发出去是什么样,别人收到就是什么样。ip 只是从域名做解析,和你报文里写的内容是无关的。
    ltfree
        14
    ltfree  
       2020-12-07 10:39:33 +08:00
    @dobelee 那时候不用 nginx 么..感觉 nginx 能完全代替这玩意吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2577 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:44 · PVG 09:44 · LAX 17:44 · JFK 20:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.