我最近使用 Nginx 在一些 Docker 容器上设置了一个反向代理服务器,它按预期工作。我将这些容器本身反向代理到在这些容器上运行的应用程序。
我只是不明白服务器如何接收子域来决定将请求路由到哪里。
据我所知,每个域名都由 DNS 服务器解析并返回服务器的 IP 地址,因此客户端可以使用收到的 IP 连接到目标服务器。但显然客户端也会将域名附加到请求中,这可能吗?
我对此没有明确的解释,因为从我的角度来看,客户端使用 IP 而不是域连接到目标服务器。
答案1
Host:
使用了标头。
当任何 Web 浏览器发出 GET 请求来加载网页时,它都会发送一个Host:
标头,Web 服务器可以使用该标头进行基于名称的虚拟托管和反向代理等操作。
虽然 Nginx 有一些关于其工作原理的文档,标题为“基于名称的虚拟服务器”我发现基于名称的虚拟主机的 Apache 文档更清楚地解释了这一切是如何运作的:
“如果请求包含
Host:
标头字段,则会在列表中搜索第一个具有匹配ServerName
或的虚拟主机ServerAlias
,并从该虚拟主机提供请求。Host:
标头字段可以包含端口号,但 Apache 始终会忽略它并与客户端发送请求的实际端口进行匹配。”
因此,一切都归结为Host:
标题:
- DNS 解析:DNS提供目标主机的IP地址。
- 主机头:发出的请求本身具有
Host:
标头,然后由接收 Web 服务器解释该标头以采取行动...或忽略...它只是一个可以使用的标头。