为什么主机地址包含在 HTTP 1.1 GET 命令中


GET /calcuapp/calculator.jsp HTTP/1.1 
Host: 192.168.1.66:8080

我正在使用 PuTTy,并且已经在设置中设置了主机目标。为什么我需要再次键入主机目标,如上所示?

简短的回答是虚拟主机。

多年来,从单个服务器托管多个站点/域已经很常见。HTTP 1.1 通过要求 host 标头来支持这一点。如果你使用HTTP 1.0,你可以省略它。

自 HTTP/1.1 以来,Host HTTP 标头是必需的,它用于虚拟主机

它必须包括服务器的域名,以及服务器正在侦听的 TCP 端口号。如果端口是所请求服务的标准端口(HTTP为80,HTTPS为443),则可以省略端口号。

缺少 Host 标头的 HTTP/1.1 请求应使用400(错误请求)状态代码进行响应。

<小时 />

RFC 7230 是 HTTP/1.1 中的当前参考消息语法和路由,它讲述了有关此标头的全部故事:

5.4. 主机

请求中的Host标头字段提供主机和端口来自目标 URI 的信息,使源服务器能够区分资源,同时为多个请求提供服务单个 IP 地址上的主机名。

Host = uri-host [ ":" port ]

客户端必须在所有 HTTP/1.1 请求中发送Host标头字段消息。 如果目标 URI 包含颁发机构组件,则客户端必须为Host发送与该字段值相同的字段值权限组件,不包括任何用户信息子组件及其@定界符。 如果缺少权限组件或未定义目标 URI,则客户端必须发送 Host 标头字段值为空的字段。

由于Host字段值是处理请求,用户代理应生成Host作为第一个标头字段遵循请求行。

例如,向源服务器发出的 GET 请求 http://www.example.org/pub/WWW/开头是:

GET /pub/WWW/ HTTP/1.1
Host: www.example.org

客户端必须在 HTTP/1.1 请求中发送 Host 标头字段,即使请求目标采用绝对形式,因为这允许 Host通过古老的HTTP/1.0代理转发的信息这可能没有实现Host.

当代理收到绝对形式为请求目标,代理必须忽略收到的Host标头字段(如果有),而是将其替换为请求目标。 转发此类请求的代理必须生成基于收到的请求目标而不是基于收到的请求目标的新Host字段值转发收到的Host字段值。

由于 Host 标头字段充当应用程序级路由机制,它是恶意软件试图毒害的常见目标共享缓存或将请求重定向到意外服务器。 一如果拦截代理依赖于 Host字段值,用于将请求重定向到内部服务器,或用作共享缓存中的缓存键,而无需首先验证截获的连接以有效的 IP 地址为目标主机。

服务器必须使用400(错误请求)状态代码响应任何HTTP/1.1 请求消息缺少Host标头字段和任何包含多个 Host 标头字段或 Host具有无效字段值的标头字段。

您的本地解析器(DNS 等)在连接之前将命令行上的主机名转换为 IP 地址; 如果有多个主机名解析为相同的 IP 地址,则远程服务器无法知道您在命令行上提供的主机名(这就是所谓的"虚拟主机";使用 HTTP 1.0, 您需要为每个不同的HTTP主机提供一个单独的IP地址,这是非常浪费的,但使您不需要传输Host:标头)。

最新更新