1

我有一IP 为 1.2.3.4的单机。这台机器有 2 个 web 服务器和一个 ftp 服务器:

  • Web Server 1 监听 82 端口;它的域:ws1.example.com

  • Web Server 2 监听 83 端口;它的域:ws2.example.com

  • FTP Server 监听 21 端口;它的域:ftp.example.com

这是 DNS 映射的样子:

ws1.example.com CNAME example.com
ws2.example.com CNAME example.com
ftp.example.com CNAME example.com
example.com A 1.2.3.4

案例 1:我在浏览器 URL ws1.example.com:82发出请求, DNS 将我重定向到example.com,但Host标头为:ws1.example.com

案例 2:我在浏览器 URL ws2.example.com:83发出请求, DNS 将我重定向到example.com,但带有Host标头:ws2.example.com

在这两种情况下:

  • 请求最终到达同一台物理机

  • 当请求到达时:

    • 在案例 1 中,请求到达这台机器,并且请求由正在侦听端口 82 的应用程序(即 Web 服务器 1)处理。

    • 在案例 2 中,请求到达这台机器,并且该请求由正在侦听端口 83 的应用程序(即 Web 服务器 2)处理。

据我了解, Host标头用于通知接收主机识别哪个服务器(从该IP托管的多个服务器中)是该请求的目的,并相应地将请求定向到适当的应用程序。

我的问题是:

  • 在此示例中,Host标头的用途是什么,因为具有相同 IP 的同一台物理机有多个应用程序在其相应的端口进行侦听。一旦请求到达这台机器,适当的端口无论如何都会被接收,而其他应用程序将忽略该请求,因为该端口与请求不匹配。那么,当适当的端口无论如何都在做他们的工作时,Host标头在这里服务的目的是什么,对吗?

  • 我能推断出吗

    1. 名称
    2. 单个 IP 后面的多个 Web 服务器
    3. 随后将特定用户请求解析到具有Host标头的相应 Web 服务器

    仅当您使用诸如反向代理之类的东西时才有意义,例如 1 台机器与客户端接口并将用户请求重定向到不同机器上的相应 Web 服务器,所有机器都在同一端口上侦听,例如 80,每台机器都位于反向代理后面的网络中,其中如果您有ws1.example.comws2.exmple.com都被重定向到反向代理example.com并且这个反向代理现在根据Host标头将其转发到适当的主机?

4

1 回答 1

3

没有 DNS 重定向

首先是一个重要的术语修复:

DNS 中没有“重定向”。在您的情况下,DNS 仅用于将名称映射到 IP。有时,由于 CNAME,一个名称会映射到另一个名称,然后再映射到 IP。是否有这样的中间步骤并不重要,最后一个名称映射到一个 IP(或者 DNS 解析失败)

这也意味着如果 URL 有一个特定的端口,那么它不会改变,最终的 IP 将通过 URL 中提到的端口进行查询。

重定向是 HTTP 级别的功能:当查询网络服务器时,https://www.mygreatsite.example/foo它会以 301、302、303、307 或 308 的 HTTP 返回码进行回复,并为您(HTTP 客户端,也称为浏览器)提供要访问的新 URL。

HTTP 虚拟主机

在过去的美好时光里,IP 地址很多。如果您在同一个物理机器上同时托管两者www.site1.examplewww.site2.example则可以为每个机器附加一个不同的IP 地址。因此,在这种特定情况下,在某种程度上,HTTPhost标头是无用的,仅连接到192.0.2.37192.0.2.42已经让您知道您想要哪个站点的事实。实际上HTTP/0.9没有host标题,因为根本没有标题。

但是,随着大规模虚拟主机开始发挥作用,并且 IPv4 地址变得稀缺,您不能再为每个站点附加一个 IP 地址,因为这也是一种浪费。因此,您通过 DNS 直接或间接(CNAME记录),两个网站都解析到同一个 IP。

因此,当 HTTP 客户端连接到服务器时,服务器默认无法知道您想要哪个网站。这就是为什么host客户端填充的 HTTP 标头让服务器知道您想要访问的网站,无论其 IP 地址如何,该网站之前已通过 DNS 解析。

默认情况下,HTTP 使用端口 80,因此它通常在 URL 中不可见。当然,如果你强迫你的客户http://www.site1.example:4569在一侧和http://www.anothersite2.com:9873另一侧使用,那么你是对的,host标题就不需要了。除了该计划因多种原因而失败:

  1. 端口号也不是无限的空间,其中许多已经通常用于其他用途;因此,即使您一次扩展此方案,您也无法将新网站附加到同一 IP
  2. 但比前面的技术点更重要的是,对于人类来说,这将是一场噩梦,许多人会使用忘记端口号,然后无法访问相应的网站。

因此,通常不会那样做,如果您想通过 HTTP 公开某些给定服务,但在非默认端口中,您通常会在其前面安装反向代理。http://www.coolpublicname.example/或者您从to执行 HTTP 重定向http://www.complicatedinternalname.example:9713,但随后客户端看到了这个赤裸裸的事实。

HTTPS 虚拟主机

顺便说一句,HTTPS 增加了一定程度的复杂性,因为 HTTPS 网络服务器需要将其证书发送给客户端,但由于每个网站可以有不同的证书,它需要知道客户端想要使用哪个网站,它可以通过hostHTTP 标头,但随后在 TLS 握手完成后出现,因此在服务器发送证书的早期阶段,这还不可用。

因此,在 HTTPS 的早期,我们再次被迫进行基于 IP 的虚拟主机,而不是像在纯 HTTP 中那样的基于名称的虚拟主机,这要归功于host标头。

解决方案是通过 TLS 扩展、服务器名称指示 (SNI) 找到的,这是客户端提前发送给服务器并提供网站名称的东西,以便服务器可以发送适当的证书,因此我们重新开始工作基于名称的情况,理论上您可以将无限数量的名称解析为相同的 IP,以便由一个给定的网络服务器提供服务。

于 2019-04-09T16:40:53.963 回答