18.2 虚拟主机托管

  • 虚拟主机托管(或称共享主机托管):Web 托管者通过让一些顾客共享一台计算机来提供便宜的 Web 主机托管服务。每个网站看起来是托管在不同的服务器上,但实际上是托管在同一个物理服务器上。从最终用户的角度来看,被虚拟托管的网站应当和托管在专用服务器上的网站没什么区别。
  • 托管者可以创建成排同样的服务器,称为服务器集群 (server farm),把负载分摊在群里的服务器上。因为群里的每台服务器都一样,并且托管了许多虚拟网站,所以管理起来更加方便。
  • 当 Joe 和 Mary 刚开始商务运作时,他们可能会选择虚拟主机托管,以节省费用,直到他们网站的流量规模达到值得使用专用服务器的水平为止。
    这里写图片描述

1. 虚拟服务器请求缺乏主机信息

  • 不幸的是,HTTP/1.0 中的一个设计缺陷会使虚拟主机托管者抓狂。HTTP/1.0 规范中没有为共享的 Web 服务器提供任何方法来识别要访问的是所托管的哪个虚拟网站。HTTP/1.0 请求中只提到 GET /index.html,没有提到主机名。
  • 下图中:
  • HTTP/1.1 中 HOST 请求首部解决了这个问题。

2. 设法让虚拟主机托管正常工作

  • 早期,在 HTTP/1.1 普及之前涌现出了 4 种解决以上问题的技术:
    • 通过 URL 路径进行虚拟主机托管
      在 URL 中增添专门的路径部分,以便服务器判断是哪个网站。比如将不同的网站放在不同命名的文件夹。
    • 通过端口号进行主机托管
      为每个站点分配不同的端口号,这样请求就由 Web 服务器的单独实例来处理。但是终端用户不会乐意在 URL 中指定非标准的端口号。
    • 通过 IP 地址进行主机托管
      为不同的虚拟站点分配专门的 IP 地址,把这些地址都绑定到一台单独的机器上。这样,Web 服务器就可以通过 IP 地址来识别网站名了。但是在计算机系统上能绑定的虚拟 IP 地址通常是有限制的,并且 IP 地址是稀缺资源。
    • 通过 Host 首部进行主机托管
      很多 Web 托管者向 HTTP 的设计者施压,要求解决这个问题。HTTP/1.0 的增强版和 HTTP/1.1 的正式版定义了 Host 请求首部来携带网站名称。Web 服务器可以通过 Host 首部识别虚拟站点。

3. HTTP/1.1 的 Host 首部

  • Host 首部是 HTTP/1.1 的请求首部,定义在 RFC 2068 中。由于虚拟服务器的流行,绝大多数 HTTP 客户端(即使是不遵循 HTTP/1.1 的客户端),都实现了 Host 首部。

1. 语法和用法

  • Host 首部描述了所请求的资源所在的因特网主机和端口号,和原始的 URL 中得到的一样:
    Host: 主机名:端口号
  • 注意的问题:
    • 如果 Host 首部不包含端口,就使用地址方案中默认的端口。
    • 如果 URL 中包含 IP 地址,Host 首部就应当包含同样的地址。
    • 如果 URL 中包含主机名,Host 首部就必须包含同样的名字。
    • 如果 URL 中包含主机名,Host 首部就不应当包含 URL 中这个主机名对应的 IP 地址,因为这样会扰乱虚拟主机托管服务器的工作,它在同一个 IP 地址上堆叠了很多虚拟站点。
    • 如果 URL 中包含主机名,Host 首部就不应当包含这个主机名的其他别名,因为这样也会扰乱虚拟主机托管服务器的工作。
    • 如果客户端显式地使用代理服务器,客户端就必须把原始服务器,而不是代理服务器的名字和端口放在 Host 首部中。以往,若干个 Web 客户端在启用客户端代理设置时,错误地把发出的 Host 首部设置成代理的主机名。这种错误行为会使代理和原始服务器都无法正常处理请求。
    • Web 客户端必须在所有请求报文中包含 Host 首部。
    • Web 代理必须在转发请求报文之前,添加 Host 首部。
    • HTTP/1.1 的 Web 服务器必须用 400 状态码来响应所有缺少 Host 首部字段的 HTTP/1.1 请求报文。

2. 缺失 Host 首部

  • 有少量在用的老式浏览器不会发送 Host 首部。如果某个虚拟主机托管服务器使用 Host 首部来判断所服务的是哪个网站,而报文中没有出现 Host 首部的话,那它可能会把用户导向某个默认的 Web 页面(例如网络服务提供商的 Web 页面),也可能返回一个错误页面建议用户升级浏览器。

3. 解释 Host 首部

  • 对于没有进行虚拟主机托管,而且不允许资源随请求主机的不同而变化的原始服务器来说,可以忽略 Host 首部字段的值。
  • 但资源会随主机名的不同而变化的原始服务器,都必须在一条 HTTP/1.1 请求判断其所请求的资源时使用下列规则:
    1. 如果 HTTP 请求报文中的 URL 是绝对的(也就是说,包含方案和主机部分),就忽略 Host 首部的值。
    2. 如果 HTTP 请求报文中的 URL 没有主机部分,而该请求带有 Host 首部,则主机/端口的值就从 Host 首部中取。
    3. 如果通过第(1)步或第(2)步都无法获得有效的主机,就向客户端返回 400 Bad Request 响应。

4. Host首部与代理

  • 某些版本的浏览器发送的 Host 首部不正确,尤其是配置使用代理的时候。例如,配置使用代理时,一些老版本的 Apple 和 PointCast 客户端会错误地把代理的名字,而不是原始服务器的名字放在 Host 首部里发送。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值