📄 mass.html
字号:
CustomLog logs/access_log.homepages vcommon<br />
<br />
VirtualDocumentRoot /www/homepages/%0/docs<br />
ScriptAlias /cgi-bin/ /www/std-cgi/<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="ipbased" id="ipbased">更为有效的基于IP地址的虚拟主机</a></h2>
<p>在<a href="#simple">第一个例子</a>中说过,转为基于IP地址的虚拟主机设置很容易做到。但不幸的是,那种做法并不高效,因为这样会在每次处理请求时,需要查询DNS。通过在文件系统中包含IP地址的做法可以避免这样的问题。这样一来,免去了和主机名的关联,在日志记录中也一样可以用IP来分离不同日志。Apache将不会为了确定主机名(ServerName)而去做DNS查询。</p>
<div class="example"><p><code>
# 从IP地址反解析得到主机名<br />
UseCanonicalName DNS<br />
<br />
# 在日志中包含IP地址,便于以后分拣<br />
LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon<br />
CustomLog logs/access_log vcommon<br />
<br />
# 在文件路径中包含IP地址<br />
VirtualDocumentRootIP /www/hosts/%0/docs<br />
VirtualScriptAliasIP /www/hosts/%0/cgi-bin<br />
</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="oldversion" id="oldversion">使用老版本的Apache</a></h2>
<p>上面的例子基于<code>mod_vhost_alias</code> ,但它是在版本1.3.6之后才出现的。如果你的版本比较老,可以通过使用<code>mod_rewrite</code>来达到相同的目的,如下所示。但只能是基于"Host:"头方式的虚拟主机。</p>
<p>此外还须注意日志方面的问题。Apache1.3.6是第一个支持"<code>%V</code>"日志格式指令的版本,在版本1.3.0-1.3.3中,"<code>%v</code>"选项做和"<code>%V</code>"一样的事情;而在版本1.3.4中没有等价指令。在所有的这些版本中,指令<code>UseCanonicalName</code>可以出现在<code>.htaccess</code>文件中,这意味着客户的设置可能会导致日志记录紊乱。所以最好的做法是使用"<code>%{Host}i</code>"指令,它可以直接记录"<code>Host:</code>"头;注意,这样可能在末尾包含"<code>:port</code>",而使用"<code>%V</code>"则不会这样。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="simple.rewrite" id="simple.rewrite">使用<code>mod_rewrite</code>实现简单的动态虚拟主机</a></h2>
<p>这里的例子摘自<code>httpd.conf</code> ,效果等同于<a href="#simple">第一个例子</a>中的情况。前半部分和上面的例子大致相似,只是为了向后兼容<code>mod_rewrite</code>作了适当修改;后半部分配置<code>mod_rewrite</code>来做实际的工作。</p>
<p>有些特别的地方需要注意:默认情况下,<code>mod_rewrite</code>在所有其他URI转换模块(<code>mod_alias</code>等)之前运行,所以如果使用这些模块的话,<code>mod_rewrite</code>必须作相应的调整。同时,我们还要为每个动态虚拟主机变些戏法,使之等效于<code>ScriptAlias</code></p>
<div class="example"><p><code>
# 从"Host:"头获取主机名<br />
UseCanonicalName Off<br />
<br />
# 可分拣的日志<br />
LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon<br />
CustomLog logs/access_log vcommon<br />
<br />
<Directory /www/hosts><br />
<span class="indent">
# 这里需要ExecCGI ,因为我们不能强制CGI以与ScriptAlias相同的方式执行<br />
Options FollowSymLinks ExecCGI<br />
</span>
</Directory><br />
<br />
# 接下来是关键部分<br />
<br />
RewriteEngine On<br />
<br />
# 来自"Host:"头的ServerName ,可能大小写混杂<br />
RewriteMap lowercase int:tolower<br />
<br />
## 首先处理普通文档<br />
# 允许变名/icons/起作用,其他变名类同<br />
RewriteCond %{REQUEST_URI} !^/icons/<br />
# 允许CGI<br />
RewriteCond %{REQUEST_URI} !^/cgi-bin/<br />
# 开始"变戏法"<br />
RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/docs/$1<br />
<br />
## 现在处理CGI(我们需要强制使用一个MIME类型)<br />
RewriteCond %{REQUEST_URI} ^/cgi-bin/<br />
RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/cgi-bin/$1 [T=application/x-httpd-cgi]<br />
<br />
# ok 了!
</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="homepages.rewrite" id="homepages.rewrite">使用<code>mod_rewrite</code>的个人主页系统</a></h2>
<p>这里的配置完成和<a href="#homepages">第二个例子</a>相同的工作。</p>
<div class="example"><p><code>
RewriteEngine on<br />
<br />
RewriteMap lowercase int:tolower<br />
<br />
# 允许CGI工作<br />
RewriteCond %{REQUEST_URI} !^/cgi-bin/<br />
<br />
# 检查hostname正确与否,之后才能使RewriteRule起作用<br />
RewriteCond ${lowercase:%{SERVER_NAME}} ^www\.[a-z-]+\.isp\.com$<br />
<br />
# 将虚拟主机名字连接到URI的开头<br />
# [C]表明本次重写的结果将在下一个rewrite规则中使用<br />
RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]<br />
<br />
# 现在创建实际的文件名<br />
RewriteRule ^www\.([a-z-]+)\.isp\.com/(.*) /home/$1/$2<br />
<br />
# 定义全局CGI目录<br />
ScriptAlias /cgi-bin/ /www/std-cgi/
</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="xtra-conf" id="xtra-conf">使用独立的虚拟主机配置文件</a></h2>
<p>这样的布局利用了<code>mod_rewrite</code>的高级特性,在独立的虚拟主机配置文件中转换。如此可以更为灵活,但需要较为复杂的设置。</p>
<p><code>vhost.map</code>文件包含了类似下面的内容:</p>
<div class="example"><p><code>
www.customer-1.com /www/customers/1<br />
www.customer-2.com /www/customers/2<br />
# ...<br />
www.customer-N.com /www/customers/N<br />
</code></p></div>
<p><code>http.conf</code>包含了:</p>
<div class="example"><p><code>
RewriteEngine on<br />
<br />
RewriteMap lowercase int:tolower<br />
<br />
# 定义映射文件<br />
RewriteMap vhost txt:/www/conf/vhost.map<br />
<br />
# 和上面的例子一样,处理别名<br />
RewriteCond %{REQUEST_URI} !^/icons/<br />
RewriteCond %{REQUEST_URI} !^/cgi-bin/<br />
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$<br />
# 这里做基于文件的重新映射<br />
RewriteCond ${vhost:%1} ^(/.*)$<br />
RewriteRule ^/(.*)$ %1/docs/$1<br />
<br />
RewriteCond %{REQUEST_URI} ^/cgi-bin/<br />
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$<br />
RewriteCond ${vhost:%1} ^(/.*)$<br />
RewriteRule ^/(.*)$ %1/cgi-bin/$1
</code></p></div>
</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 + -