Vla*_*nin 95 http http-headers
鉴于在发送HTTP请求时已建立TCP连接,因此隐式知道IP地址和端口 - TCP连接是IP +端口.那么,为什么我们需要Host
标题?这是否只有在多个主机映射到TCP连接中隐含的IP地址的情况下才需要?
Psi*_*Psi 111
该host
头告诉该网站服务器虚拟主机使用(如果设置).您甚至可以使用多个别名(=域和通配符域)来拥有相同的虚拟主机.在这种情况下,如果您想根据所解决的不同域提供不同的行为,您仍然可以在Web应用程序中手动读取该标题.这是可能的,因为在您的网络服务器中,您可以(如果我没有记错,您必须)设置一个虚拟主机作为默认主机.只要host
标头与任何已配置的虚拟主机不匹配,就会使用此默认vhost .
这意味着:你做对了,虽然说"多个主机"可能有些误导:主机(被寻址的机器)是相同的,真正得到解决的IP地址是不同的域名(包括子域),也被引用作为主机名(但不是主机!).
虽然不是问题的一部分,但有趣的是:此规范在早期导致SSL出现问题,因为Web服务器必须提供与客户端已解决的域相对应的证书.但是,为了知道要使用的证书,Web服务器应该事先知道所寻址的主机名.但是因为客户端仅通过加密通道发送该信息(这意味着:在证书已经发送之后),服务器必须假设您浏览了默认主机.这意味着每个IP地址/端口组合有一个ssl安全域.
服务器名称指示已经克服了这一点; 然而,这再次破坏了一些隐私,因为服务器名称现在再次以纯文本形式传输,因此每个中间人都会看到您尝试连接的主机名.
虽然Web服务器将知道服务器名称指示中的主机名,但host
标头不会过时,因为服务器名称指示信息仅在TLS握手中使用.使用不安全的连接时,根本没有服务器名称指示,因此host
标头仍然有效(并且是必需的).
另一个有趣的事实:大多数Web服务器(如果不是全部)拒绝您的http请求,如果它不包含一个host
标头,即使它可以省略,因为只配置了默认的vhost.这意味着http-(get-)请求中的最小必需信息是包含METHOD
RESOURCE
and PROTOCOL VERSION
和至少host
-header 的第一行,如下所示:
GET /someresource.html HTTP/1.1
Host: www.example.com
Run Code Online (Sandbox Code Playgroud)
您可能需要阅读Host-Header上的MDN文档以获取更多信息
必须在所有HTTP/1.1请求消息中发送主机头字段.400(错误请求)状态代码将被发送到缺少主机头字段或包含多个的任何HTTP/1.1请求消息.
正如Darrel Miller所提到的,完整的规范可以在RFC7230中找到.
Dar*_*ler 25
在尝试理解HTTP标头的含义和目的时,我总是建议去权威来源.
请求中的"主机"头字段提供
来自目标URI 的主机和端口信息,使原始服务器能够 在为单个IP地址上的
多个
主机名的请求提供服务时区分资源.
https://tools.ietf.org/html/rfc7230#section-5.4
归档时间: |
|
查看次数: |
95092 次 |
最近记录: |