配置多IP基于域名的虚拟主机

如果你想为不同的IP地址或是端口提供不同的内容,那么上一文中说到的“Apache服务器同一IP绑定多个域名”就不适合了。

在多IP情况下配置基于域名的虚拟主机
注意
在这里讨论的任何技术都可以推广到使用任意数量的IP地址。

服务器有两个IP地址。一个(172.10.30.40)用于主服务器server.domain.com ,另外一个(172.10.30.50)用于构建两个或多个虚拟主机。

服务器配置
Listen 80

# "主"服务器运行于:172.10.30.40
ServerName server.domain.com
DocumentRoot /www/mainserver

# 这是另外一个IP地址
NameVirtualHost 172.10.30.50

DocumentRoot /www/example1
ServerName www.example.com
# 你可以在这里添加其他指令 …

DocumentRoot /www/example2
ServerName www.example.org
# 你可以在这里添加其他指令 …

任何不是针对172.10.30.50的请求都将由主服务器来伺服。而提交给172.10.30.50却没有主机名或没有”Host:”头的请求,都将由ww.example.com伺服。

在不同IP地址(比如一个内部和一个外部地址)上提供相同的内容
服务器有两个IP地址(192.168.1.1和172.10.30.40)。这个机器位于内部(局域网)网络和外部(广域网)之间。在外部,域名server.example.com指向外部地址(172.10.30.40),而在内部则指向内部地址(192.168.1.1)。

服务器可以为来自内部和外部的请求提供同样的内容,只需要一个配置段就可以了。

服务器配置
NameVirtualHost 192.168.1.1
NameVirtualHost 172.10.30.40

DocumentRoot /www/server1
ServerName server.example.com
ServerAlias server

现在,从不同的网络提交的请求都会由同一个段来伺服。

注意
在内网中,您可以使用server这个名字来代替server.example.com这个全名。

跟上面一样,在上述的例子里,您可以用”*”来代替具体的IP地址,这样就可以对所有的地址都返回相同的内容了。

在不同的端口上运行不同的站点
如果您想让同一个IP的不同端口伺服多个域名。您可以借助在NameVirtualHost指令中定义端口的方法来达到这个目的。如果您想使用不带”name:port”的或是直接用Listen指令,您的配置将无法生效。

服务器配置
Listen 80
Listen 8080

NameVirtualHost 172.10.30.40:80
NameVirtualHost 172.10.30.40:8080

ServerName www.example.com
DocumentRoot /www/domain-80

ServerName www.example.com
DocumentRoot /www/domain-8080

ServerName www.example.org
DocumentRoot /www/otherdomain-80

ServerName www.example.org
DocumentRoot /www/otherdomain-8080

建立基于IP的虚拟主机
一个有两个IP地址(172.10.30.40和172.10.30.50)分别对应域名www.yeah2.comSEO.yeah2.com的配置如下:

服务器配置
Listen 80

DocumentRoot /www/Yeah1
ServerName www.yeah2.com

DocumentRoot /www/Yeah2
ServerName seo.yeah2.com

如果存在主服务器,那么对没有出现在任一个段中的请求(比如,对localhost的请求)都会由主服务器来伺服。

混用基于端口和基于IP的虚拟主机
如果您的服务器有两个IP地址(172.10.30.40和172.10.30.50)分别对应域名www.yeah2.com和seo.yeah2.com 。对每个域名,您都希望在80端口和8080端口发布您的网站。您可以这样配置:

服务器配置
Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080

DocumentRoot /www/example1-80
ServerName www.example.com

DocumentRoot /www/example1-8080
ServerName www.example.com

DocumentRoot /www/example2-80
ServerName www.example.org

DocumentRoot /www/example2-8080
ServerName www.example.org

混用基于域名和基于IP的虚拟主机
您想在一些地址上配置基于域名的虚拟主机而在另外一些地址上配置基于IP的虚拟主机。

服务器配置
Listen 80

NameVirtualHost 172.20.30.40

DocumentRoot /www/example1
ServerName www.example.com

DocumentRoot /www/example2
ServerName www.example.org

DocumentRoot /www/example3
ServerName www.example3.net

# IP-based
DocumentRoot /www/example4
ServerName www.example4.edu

DocumentRoot /www/example5
ServerName www.example5.gov

和mod_proxy模块一起使用
下面的例子允许一个前端机器代理一个运行在其他机器上的虚拟主机。在如下示例中,在192.168.111.2机器上配置了一个同名的虚拟主机。这样,万一在同一台机器上代理了多个主机名,ProxyPreserveHostOn 指令能确保指定的主机名顺利通过代理。


ProxyPreserveHost On
ProxyPass / http://192.168.111.2
ProxyPassReverse / http://192.168.111.2/
ServerName hostname.example.com

使用“_default_”虚拟主机
为所有端口配置“_default_”虚拟主机
这样配置可以捕获所有指向没指定的IP地址和端口的请求。比如:一个没被任何虚拟主机使用的地址/端口对。

服务器配置
DocumentRoot /www/default

这样一个使用通配符端口的默认虚拟主机可以有效的防止请求被主服务器接收。

如果一个地址/端口对已经被一个基于域名的虚拟主机使用,那么”_default_”虚拟主机决不会处理发向这个地址/端口对的请求。如果一个”Host:”请求头中包含未知信息,或者干脆就没有,那么它会被第一个基于域名的虚拟主机(也就是在配置文件中最先出现的使用了那个地址/端口对的虚拟主机)处理。

您可以用AliasMatch或RewriteRule来重写任何请求,使它指向一个简单信息页面(或脚本)。

为不同的端口配置"_default_"虚拟主机
与第一种一样,但我们想让服务器侦听很多端口而第二个"_default_"虚拟主机单独侦听80端口。

服务器配置

DocumentRoot /www/default80
# ...

DocumentRoot /www/default
# …

侦听80端口的”_default_”虚拟主机(必须出现在所有使用通配符端口的虚拟主机之前)会捕获所有发向一个未指定的IP地址的请求。主服务器将不会用于伺服任何请求。

为单独一个端口配置"_default_"虚拟主机
如果我们只想在80端口上建立唯一的一个"_default_"虚拟主机,我们应该这样配置:

服务器配置

DocumentRoot /www/default
...

发向一个未指定地址的80端口的请求将会由这个虚拟主机伺服;而发向未设定地址的其他端口的请求则由主服务器伺服。

将一个基于域名的虚拟主机移植为一个基于IP的虚拟主机

如果一个具有ww.example.org域名的虚拟主机(就是基于域名配置示例中的第二个)得到了自己的IP地址。为了避免一些域名服务器或代理服务器在移植期间仍对这个域名做老的解析,我们可以采用一种过渡方法:同时提供新旧两个IP地址的解析。

达到这个目的很简单。因为我们只要简单的把新地址(172.10.30.50)加入VirtualHost指令就行了。

服务器配置
Listen 80
ServerName www.example.com
DocumentRoot /www/example1

NameVirtualHost 172.10.30.40

DocumentRoot /www/example2
ServerName www.example.org
# …

DocumentRoot /www/example3
ServerName www.example.net
ServerAlias *.example.net
# …

现在这个虚拟主机就可以用新地址(表现为一个基于IP的虚拟主机)和旧地址(表现为一个基于域名的虚拟主机)同时进行访问了。

使用ServerPath指令

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

服务器配置
NameVirtualHost 172.20.30.40

# 主虚拟主机
DocumentRoot /www/subdomain
RewriteEngine On
RewriteRule ^/.* /www/subdomain/index.html
# …

DocumentRoot /www/subdomain/sub1
ServerName www.sub1.domain.tld
ServerPath /sub1/
RewriteEngine On
RewriteRule ^(/sub1/.*) /www/subdomain$1
# …

DocumentRoot /www/subdomain/sub2
ServerName www.sub2.domain.tld
ServerPath /sub2/
RewriteEngine On
RewriteRule ^(/sub2/.*) /www/subdomain$1
# …

由于ServerPath指令的作用,发送到htp://www.sub1.domain.tld/sub1/的请求总会被sub1-vhost所伺服。
如果客户端发送了正确的”Host:”头,发送到htp://www.sub1.domain.tld、的请求只会被sub1-vhost所伺服。如果没有发送”Host:”头,客户端将会得到从主虚拟主机发送的信息页面。

请注意,这里还有一点小问题:如果客户端没有发送”Host:”头,发送到www.sub2.domain.tld/sub1/的请求还是会被sub1-vhost所伺服。

做网站这些服务器配置肯定是要懂点的。

可以不经允许随意转载,分享:广州SEO,移动互联网营销 » 配置多IP基于域名的虚拟主机

分享的每套dede模板,整站带数据源码,wordpress模板,整站源码下载,帝国cms模板,带数据帝国cms网站,淘宝客源码,女性网站模板等源码的下载链接地址请咨询QQ索取。
赞 (0)
分享到: 更多