Host
图:虚拟主机运行在同一个 IP 上,因此使用首部字段 Host 加以区分
Host: www.hackr.jp
首部字段 Host 会告知服务器,请求的资源所处的互联网主机名和端口号。Host 首部字段在 HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段。
首部字段 Host 和以单台服务器分配多个域名的虚拟主机的工作机制有很密切的关联,这是首部字段 Host 必须存在的意义。
请求被发送至服务器时,请求中的主机名会用 IP 地址直接替换解决。但如果这时,相同的 IP 地址下部署运行着多个域名,那么服务器就会无法理解究竟是哪个域名对应的请求。因此,就需要使用首部字段 Host 来明确指出请求的主机名。
若服务器未设定主机名,那直接发送一个空值即可。如下所示。
Host:
之前介绍了客户端和服务器之间建立连接,下面介绍服务器接收到连接之后怎么将HTTP消息进行路由和常规处理的流程,这里将介绍host请求头部。
先必须存在uri-host,对于它的port是可选的,如果有需要加冒号分隔,在HTTP 1.1规范当中必须要传递host头部,否者会返回400错误响应码。
在HTTP版本1.0是没有host这个头部的,因为在那个时代域名是比较少的,每个服务器的IP地址仅对应一个域名,当用户对你的服务器建立连接之后是不需要考虑匹配哪个域名对应的服务的,后来发现域名众多,但是IP地址相对较少,所以引入的host头部。
为了防止陈久的服务器在网络当中,发向正向代理的请求 request-target 必须以 absolute-form 形式出现,而不是相对url,绝对url当中必须包含shceme,就是HTTP,还有中间的域名,authorities user information这些信息。
对于以下三类都返回400错误,包括缺失了host头部请求,以及超过了一个host头部,或者host中的值是不合法的。
大部分web服务器在建立好TCP连接之后,在蓝色的部分会去读取请求头部,不包含message body,在这里会包含两个部分,一个是request line请求行,其次是header。
在url当中拿到了绝对路径,或者从header中的host头部也可以取到域名。拿到域名之后就会和web服务器支持的所有域名进行匹配,选中之后就会选到相应的模块进行处理。
接着进行第二步的路由匹配,就是按照uri的path路径一一匹配相应的代码,找到处理请求的代码。然后开始访问相应的资源,然后生成HTTP的响应,基于过滤器架构从respons filter一个一个的去修改响应,最后将响应发送给客户端或者浏览器,最后记录一条access访问日志。
上面就是基于host头部以及如何基于host进行消息的路由。服务器基于host头部进行路由的流程与大部分web服务器相似,对我们具有参考价值。