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

时间:2016-07-17 08:54:53

标签: http

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

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

3 个答案:

答案 0 :(得分:3)

简短的回答是Virtual Hosts。

多年来,从单个服务器托管多个站点/域是很常见的。 HTTP 1.1通过要求host标头来支持此功能。如果您使用HTTP 1.0,则可以将其保留。

答案 1 :(得分:1)

Host HTTP标头是必需的,因为HTTP / 1.1并且它用于虚拟主机

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

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

RFC 7230,HTTP / 1.1中的当前参考消息语法和路由,讲述了有关此标题的整个故事:

  

5.4. Host

     

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

Host = uri-host [ ":" port ]
     

客户端务必在所有HTTP / 1.1请求中发送Host头字段     消息。如果目标URI包含权限组件,则a     客户端必须发送与Host相同的字段值     权限组件,不包括任何userinfo子组件及其@     分隔符。如果缺少权限组件或     未定义目标URI,然后客户端必须发送Host标头     具有空字段值的字段。

     

由于Host字段值是处理a的关键信息     请求,用户代理应该生成Host作为第一个头字段     请求行之后。

     

例如,对源服务器的GET请求     http://www.example.org/pub/WWW/将以:

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

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

     

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

     

由于Host标头字段充当应用程序级路由     机制,它是恶意软件寻求毒害的常见目标     共享缓存或将请求重定向到非预期的服务器。一个     拦截代理特别容易受到攻击     Host字段值,用于将请求重定向到内部服务器或用于     在没有首先验证的情况下,用作共享缓存中的缓存键     截获的连接针对的是有效的IP地址     主机。

     

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

答案 2 :(得分:0)

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