HTTP:权威指南说
未虚拟托管且不允许资源因请求的主机而异的源服务器可能会忽略 Host 标头字段值。但是任何基于主机区分资源的源服务器都必须使用以下规则来确定 HTTP/1.1 请求中请求的资源:
如果HTTP 请求消息中的 URL是绝对的(即,包含方案和主机组件),则忽略 Host 标头中的值以支持 URL。
如果HTTP 请求消息中的 URL没有主机,并且请求包含 Host 头,则从 Host 头中获取主机/端口的值。
如果通过步骤 1 或 2 无法确定有效主机,则向客户端返回 400 Bad Response 响应。
“HTTP 请求消息中的 URL”在哪里?
它是请求行中的那个吗(在 HTTP 请求的第一行,在方法之后GET
)?
谢谢。
该 URL 不需要出现在 HTTP 请求中的任何位置(向代理发出时除外;见下文)。
您书中引用的第 2 点有错误。URL 不会出现在原始形式的请求行中,这是 HTTP 请求目标的最常见形式。通常只有 URL 的特定组件出现在请求中,即出现在 Host 标头中的主机(和端口,如果适用),以及出现在请求行中的路径和查询字符串。请求中没有出现的一件事是方案(http 或 https),如果 Web 应用程序确实需要了解方案,它偶尔会适合开发人员。
请求行的替代形式可能包含完整的 URL 作为请求目标,并且服务器必须能够处理这种格式,称为绝对形式。除非用户代理故意与 HTTP 代理交谈,否则通常不会看到这种形式。在这种情况下,代理需要知道方案,以便它可以尝试传递请求,完整的 URL 形式是相关标准 (RFC 7230) 中定义的方式。