📄 examples.html
字号:
</span>
</VirtualHost><br />
<br />
<VirtualHost 172.20.30.40:8080><br />
<span class="indent">
DocumentRoot /www/example1-8080<br />
ServerName www.example.com<br />
</span>
</VirtualHost><br />
<br />
<VirtualHost 172.20.30.50:80><br />
<span class="indent">
DocumentRoot /www/example2-80<br />
ServerName www.example.org<br />
</span>
</VirtualHost><br />
<br />
<VirtualHost 172.20.30.50:8080><br />
<span class="indent">
DocumentRoot /www/example2-8080<br />
ServerName www.example.org<br />
</span>
</VirtualHost>
</code></p></div>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="mixed" id="mixed">混用基于域名和基于IP的虚拟主机</a></h2>
<p>您想在一些地址上配置基于域名的虚拟主机而在另外一些地址上配置基于IP的虚拟主机。</p>
<div class="example"><h3>服务器配置</h3><p><code>
Listen 80<br />
<br />
NameVirtualHost 172.20.30.40<br />
<br />
<VirtualHost 172.20.30.40><br />
<span class="indent">
DocumentRoot /www/example1<br />
ServerName www.example.com<br />
</span>
</VirtualHost><br />
<br />
<VirtualHost 172.20.30.40><br />
<span class="indent">
DocumentRoot /www/example2<br />
ServerName www.example.org<br />
</span>
</VirtualHost><br />
<br />
<VirtualHost 172.20.30.40><br />
<span class="indent">
DocumentRoot /www/example3<br />
ServerName www.example3.net<br />
</span>
</VirtualHost><br />
<br />
# IP-based<br />
<VirtualHost 172.20.30.50><br />
<span class="indent">
DocumentRoot /www/example4<br />
ServerName www.example4.edu<br />
</span>
</VirtualHost><br />
<br />
<VirtualHost 172.20.30.60><br />
<span class="indent">
DocumentRoot /www/example5<br />
ServerName www.example5.gov<br />
</span>
</VirtualHost>
</code></p></div>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="proxy" id="proxy">将<code><Virtual_host></code>和<code>mod_proxy</code>模块一起使用</a></h2>
<p>下面的例子允许一个前端机器代理一个运行在其他机器上的虚拟主机。在如下示例中,在<code>192.168.111.2</code>机器上配置了一个同名的虚拟主机。这样,万一在同一台机器上代理了多个主机名,<code class="directive"><a href="../mod/mod_proxy.html#proxypreservehost">ProxyPreserveHost</a> On</code> 指令能确保指定的主机名顺利通过代理。</p>
<div class="example"><p><code>
<VirtualHost *:*><br />
ProxyPreserveHost On<br />
ProxyPass / http://192.168.111.2<br />
ProxyPassReverse / http://192.168.111.2/<br />
ServerName hostname.example.com<br />
</VirtualHost>
</code></p></div>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="default" id="default">使用"<code>_default_</code>"虚拟主机</a></h2>
<h3><a name="defaultallports" id="defaultallports">为所有端口配置"<code>_default_</code>"虚拟主机</a></h3>
<p>这样配置可以捕获<em>所有</em>指向没指定的IP地址和端口的请求。比如:一个没被任何虚拟主机使用的地址/端口对。</p>
<div class="example"><h3>服务器配置</h3><p><code>
<VirtualHost _default_:*><br />
<span class="indent">
DocumentRoot /www/default<br />
</span>
</VirtualHost>
</code></p></div>
<p>这样一个使用通配符端口的默认虚拟主机可以有效的防止请求被主服务器接收。</p>
<p>如果一个地址/端口对已经被一个基于域名的虚拟主机使用,那么"<code>_default_</code>"虚拟主机决不会处理发向这个地址/端口对的请求。如果一个"<code>Host:</code>"请求头中包含未知信息,或者干脆就没有,那么它会被第一个基于域名的虚拟主机(也就是在配置文件中最先出现的使用了那个地址/端口对的虚拟主机)处理。</p>
<p>您可以用<code class="directive"><a href="../mod/mod_alias.html#aliasmatch">AliasMatch</a></code>或<code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code>来重写任何请求,使它指向一个简单信息页面(或脚本)。</p>
<h3><a name="defaultdifferentports" id="defaultdifferentports">为不同的端口配置"<code>_default_</code>"虚拟主机</a></h3>
<p>与第一种一样,但我们想让服务器侦听很多端口而第二个"<code>_default_</code>"虚拟主机单独侦听80端口。</p>
<div class="example"><h3>服务器配置</h3><p><code>
<VirtualHost _default_:80><br />
<span class="indent">
DocumentRoot /www/default80<br />
# ...<br />
</span>
</VirtualHost><br />
<br />
<VirtualHost _default_:*><br />
<span class="indent">
DocumentRoot /www/default<br />
# ...<br />
</span>
</VirtualHost>
</code></p></div>
<p>侦听80端口的"<code>_default_</code>"虚拟主机(<em>必须</em>出现在所有使用通配符端口的虚拟主机之前)会捕获所有发向一个未指定的IP地址的请求。主服务器将不会用于伺服任何请求。</p>
<h3><a name="defaultoneport" id="defaultoneport">为单独一个端口配置"<code>_default_</code>"虚拟主机</a></h3>
<p>如果我们只想在80端口上建立唯一的一个"<code>_default_</code>"虚拟主机,我们应该这样配置:</p>
<div class="example"><h3>服务器配置</h3><p><code>
<VirtualHost _default_:80><br />
DocumentRoot /www/default<br />
...<br />
</VirtualHost>
</code></p></div>
<p>发向一个未指定地址的80端口的请求将会由这个虚拟主机伺服;而发向未设定地址的其他端口的请求则由主服务器伺服。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="migrate" id="migrate">将一个基于域名的虚拟主机移植为一个基于IP的虚拟主机</a></h2>
<p>如果一个具有<code>www.example.org</code>域名的虚拟主机(就是<a href="#name">基于域名</a>配置示例中的第二个)得到了自己的IP地址。为了避免一些域名服务器或代理服务器在移植期间仍对这个域名做老的解析,我们可以采用一种过渡方法:同时提供新旧两个IP地址的解析。</p>
<p>达到这个目的很简单。因为我们只要简单的把新地址(<code>172.20.30.50</code>)加入<code>VirtualHost</code>指令就行了。</p>
<div class="example"><h3>服务器配置</h3><p><code>
Listen 80<br />
ServerName www.example.com<br />
DocumentRoot /www/example1<br />
<br />
NameVirtualHost 172.20.30.40<br />
<br />
<VirtualHost 172.20.30.40 172.20.30.50><br />
<span class="indent">
DocumentRoot /www/example2<br />
ServerName www.example.org<br />
# ...<br />
</span>
</VirtualHost><br />
<br />
<VirtualHost 172.20.30.40><br />
<span class="indent">
DocumentRoot /www/example3<br />
ServerName www.example.net<br />
ServerAlias *.example.net<br />
# ...<br />
</span>
</VirtualHost>
</code></p></div>
<p>现在这个虚拟主机就可以用新地址(表现为一个基于IP的虚拟主机)和旧地址(表现为一个基于域名的虚拟主机)同时进行访问了。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="serverpath" id="serverpath">使用<code>ServerPath</code>指令</a></h2>
<p>如果我们在同一个服务器上运行了两个基于域名的虚拟主机。为了匹配正确的虚拟主机,客户端必须发送正确的"<code>Host:</code>"头。而旧的使用HTTP/1.0的客户端无法发送这样的头,这样Apache就无法辨别客户端想要连接哪个虚拟主机(会用主虚拟主机来伺服这个请求)。为了尽量提供向下兼容性,我们可以提供一个主虚拟主机来返回一个页面,在页面中加入指向基于域名的虚拟主机的URL前缀的链接。</p>
<div class="example"><h3>服务器配置</h3><p><code>
NameVirtualHost 172.20.30.40<br />
<br />
<VirtualHost 172.20.30.40><br />
<span class="indent">
# 主虚拟主机<br />
DocumentRoot /www/subdomain<br />
RewriteEngine On<br />
RewriteRule ^/.* /www/subdomain/index.html<br />
# ...<br />
</span>
</VirtualHost><br />
<br />
<VirtualHost 172.20.30.40><br />
DocumentRoot /www/subdomain/sub1<br />
<span class="indent">
ServerName www.sub1.domain.tld<br />
ServerPath /sub1/<br />
RewriteEngine On<br />
RewriteRule ^(/sub1/.*) /www/subdomain$1<br />
# ...<br />
</span>
</VirtualHost><br />
<br />
<VirtualHost 172.20.30.40><br />
<span class="indent">
DocumentRoot /www/subdomain/sub2<br />
ServerName www.sub2.domain.tld<br />
ServerPath /sub2/<br />
RewriteEngine On<br />
RewriteRule ^(/sub2/.*) /www/subdomain$1<br />
# ...<br />
</span>
</VirtualHost>
</code></p></div>
<p>由于<code class="directive"><a href="../mod/core.html#serverpath">ServerPath</a></code>指令的作用,发送到<code>http://www.sub1.domain.tld/sub1/</code>的请求<em>总会</em>被sub1-vhost所伺服。<br />如果客户端发送了正确的"<code>Host:</code>"头,发送到<code>http://www.sub1.domain.tld/</code>的请求只会被sub1-vhost所伺服。如果没有发送"<code>Host:</code>"头,客户端将会得到从主虚拟主机发送的信息页面。</p>
<p>请注意,这里还有一点小问题:如果客户端没有发送"<code>Host:</code>"头,发送到<code>http://www.sub2.domain.tld/sub1/</code>的请求还是会被sub1-vhost所伺服。</p>
<p><code class="directive"><a href="../mod/mod_rewrite.html#rewriterule">RewriteRule</a></code>指令用以确保正确发送了"<code>Host:</code>"头的客户端可以任意使用这两种URL变量,比如说:使用或不使用URL前缀。</p>
</div></div>
<div id="footer">
<p class="apache">本文允许自由使用、分发、转载,但必须保留译者署名;详见:<a href="../translator_announcement.html#announcement">译者声明</a>。</p>
<p class="menu"><a href="../mod/index.html">模块索引</a> | <a href="../mod/directives.html">指令索引</a> | <a href="../faq/index.html">常见问题</a> | <a href="../glossary.html">词汇表</a> | <a href="../sitemap.html">站点导航</a></p></div>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -