请求中的“Host”头字段提供了目标URI的主机和端口信息,使得源服务器在同一个IP地址上为多个主机名提供服务时得以区分不同的资源。
Host = uri-host [ ":" port ] ; 2.7.1节
在所有的HTTP/1.1请求消息中客户端必须发送Host头字段。如果目标URI包含权威组件,那么客户端必须为Host发送一个与之相同的字段值,不包括任何用户信息子组件和它的“@”分隔符(2.7.1节)。如果权威组件缺失或者目标URI没有定义,客户端必须发送一个空字段值的Host头字段。
因为Host字段值是处理一个请求的重要的信息,用户代理应该紧跟请求行之后生成Host作为第一个头字段。
例如,一个发往源服务器请求<http://www.example.org/pub/WWW/>
的GET请求将以这样开始:
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地址,那么它将十分脆弱。
对任何缺少Host头字段的HTTP/1.1请求消息,以及任何包含超过一个Host头字段或有一个无效字段值的请求消息,服务器必须响应一个400(错误请求)状态码。