以下引自HTTP 权威指南假设“URL”来自某个地方并使用它来限制 Host 标头。“URL”来自哪里?是来自 HTTP 请求的第一行(例如 之后GET
),还是来自 Web 客户端的输入(例如 的参数curl
或 Web 浏览器地址栏中的输入)?谢谢。
Host 标头指定了所请求资源的 Internet 主机和端口号,该标头从原始网址:
Host = "Host" ":" host [ ":" port ]
尤其:
• 如果主机标头不包含端口,则假定使用方案的默认端口。
• 如果URL包含 IP 地址,主机头也应该包含相同的地址。
• 如果URL包含主机名,Host 头必须包含相同的名称。
• 如果URL包含主机名,则 Host 标头不应包含与 URL 主机名等同的 IP 地址,因为这将破坏虚拟托管服务器(该服务器在单个 IP 地址上分层放置多个虚拟站点)。
• 如果URL包含主机名,则 Host 标头不应包含此主机名的另一个别名,因为这也会破坏虚拟托管的服务器。
答案1
主机字段是在HTTPv1.0标准中引入的,并且是可选的。
在 HTTPv1.1 中,您必须使用 Host 字段。
在此标准之前,以 HTTPv0.9 为例,浏览器过去常常简单地发出单个远程命令,例如;
GET example.com/index.html[cr][lf][cr][lf]
[cr][lf] 是回车符,因此该行上有双回车符。
为了更好地支持 SSL 以及其他一些原因,他们在 HTTPv1 中添加了 Host 字段。
在 HTTPv1+ 中,浏览器中的相同请求如下所示;
GET example.com/index.html[cr][lf]
Host: example.com[cr][lf]
[cr][lf][cr][lf]
或者
GET index.html[cr][lf]
Host: example.com[cr][lf]
[cr][lf][cr][lf]
例如请求;
GET example.com/index.html[cr][lf]
Host: contoso.com[cr][lf]
[cr][lf][cr][lf]
这将是一个逻辑错误,并且 RFC 警告您这是反对这种事情的。
如您所见,URL 是由远程服务器构建的,具体取决于查询的编写方式。