服务器 频道

虚拟主机的例子(下)

使用ServerPath指令

  如果我们在一个服务器上运行了两个基于域名的虚拟主机。为了匹配正 确的虚拟主机,客户端必须发送正确的Host:头。而旧的使用 HTTP/1.0的客户端无法发送这样的头,这样,Apache就无法辨别客户端想要 连接哪个虚拟主机(会用主虚拟主机来伺服这个请求)。为了尽量提供向下 兼容性,我们可以可以提供一个主虚拟主机来返回一个页面,在页面中加入 指向基于域名的虚拟主机的URL前缀的链接。

Server configuration

  NameVirtualHost 172.20.30.40
  
  <VirtualHost 172.20.30.40>
  
# primary vhost
  DocumentRoot /www/subdomain
  RewriteEngine On
  RewriteRule ^/.* /www/subdomain/index.html
  # ...
  
</VirtualHost>
  
  <VirtualHost 172.20.30.40>
  DocumentRoot /www/subdomain/sub1
  
ServerName www.sub1.domain.tld
  ServerPath /sub1/
  RewriteEngine On
  RewriteRule ^(/sub1/.*) /www/subdomain$1
  # ...
  
</VirtualHost>
  
  <VirtualHost 172.20.30.40>
  
DocumentRoot /www/subdomain/sub2
  ServerName www.sub2.domain.tld
  ServerPath /sub2/
  RewriteEngine On
  RewriteRule ^(/sub2/.*) /www/subdomain$1
  # ...
  
</VirtualHost>

  由于ServerPath指令的作用, 发送到http://www.sub1.domain.tld/sub1/的请求总会 被sub1-vhost所伺服。
  如果客户端发送了正确的Host:头,发送到 http://www.sub1.domain.tld/的请求指挥被sub1-vhost伺服。 如果没有发送Host:头,客户端会得到从主虚拟主机发送的信 息页面。
  请注意,这里还有一点小问题:如果客户端没有发送Host:头, 发送到http://www.sub2.domain.tld/sub1/的请求还是会被 sub1-vhost伺服。
  RewriteRule指令用以确 保正确发送了Host:头的客户端可以任意使用这两种URL变量, 比如说:使用或不使用URL前缀。

0
相关文章