Host = uri-host [ ":" port ]
- HTTP/1.1 规范要求,不传递Host头部则返回 400 错误响应码
- 为防止陈旧代理服务器,发正向代理请求 request-target 必须以 absolute-form 形式出现
为什么要求传递Host?
HTTP/1.0中是没有Host头部的,当时域名较少,一个域名只针对一个IP,当用户对服务器建立起连接的时候,是不要考虑匹配哪个域名对应的服务。现在域名众多,IP地址较少,一个IP可能对应多个域名。
关于Host头部:https://tools.ietf.org/html/rfc7230#section-5.4
- A client MUST send a Host header field in all HTTP/1.1 request messages.
- A server MUST respond with a 400 (Bad Request) status code to any HTTP/1.1 request message that lacks a Host header field and to an requestmessage that contains more than one Host header field or a Host header field with an invalid field-value.
请求发到服务器端消息如何路由?
为什么陈旧的服务器加上绝对路径就会正确处理,相对路径就不会呢?
- 只识别http/1.0的代理服务器,是不认识Host头部的,但它会识别绝对URI包括里面的域名。
- Nginx如果找到绝对URI中的域名,就不会使用Host中的域名。所以URI中域名优先级更高。