ServerPath 指令

语法 ServerPath URL-path
说明 为兼容性不好的浏览器访问基于域名的虚拟主机保留的URL路径名

要了解ServerPath 的作用,就不得不说一下http的host头信息
HTTP/1.1要求在请求的时候发送Host头域,值是资源的Intenet主机和端口号,也就是说你访问xxx.bbb.com:8080/aaa/bbb的时候,host头信息将xxx.bbb.com:8080。

但是老的浏览器不会发送这个host头信息。
于是在apache的虚拟服务器中,比如
<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>

因为对于虚拟主机来说,两个IP是相同的。当通过
www.sub1.domain.tld
或者
www.sub2.domain.tld
访问的时候,同时满足了两个虚拟主机,如果没有发送host过来,那么自然无法识别应该访问哪个虚拟主机。

于是这个时候ServerPath 起作用了。
如果发送了host,只要根据host的值和ServerName 比较一下而已,也就是说
www.sub2.domain.tld下面的任何路径都将映射到第二个虚拟主机。
但是没有发送host的情况就不行,这个时候只能根据路径来寻找了。
htp://www.sub1.domain.tld/sub1/符合第一个虚拟主机,于是进入第一个虚拟主机。
另外一点需要说明的是,如果没有发送host的主机,那么不管你是http://www.sub2.domain.tld/sub1/
还是http://www.sub1.domain.tld/sub1/
的请求,都将被第一个虚拟主机所处理。因为没有发送host,只能通过路径来发现,两个域名虽然不同,但是他们的路径都只满足第一个而不是第二个虚拟主机。

你可能感兴趣的:(server)