ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# Apache模块 mod_vhost_alias | [说明](#calibre_link-11) | 提供大批量虚拟主机的动态配置支持 | | --- | --- | | [状态](#calibre_link-12) | 扩展(E) | | [模块名](#calibre_link-13) | vhost_alias_module | | [源文件](#calibre_link-14) | mod_vhost_alias.c | ### 概述 本模块通过将HTTP请求中的IP地址和/或"`Host:`"头内容转换为所要提供服务的文件路径名来创建动态的虚拟主机配置。这样的做法,使得应用配置大量相似的虚拟主机变得更为容易。 ### 注意 如果使用`mod_alias`或`mod_userdir`来将URI转换为文件名,那么`mod_vhost_alias`的设定将被覆盖。例如,下面的配置将始终把`/cgi-bin/script.pl` 映射为`/usr/local/apache2/cgi-bin/script.pl` 。 ``` ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/ VirtualScriptAlias /never/found/%0/cgi-bin/ ``` ## 目录名称的转换 本模块中的所有指令都用于将字符串替换为路径名。被替换的字符串(以后称为"name")可以是服务器名(参见`UseCanonicalName`指令以了解决策方法)或者是"点数字"格式的虚拟主机IP地址。替换操作由`printf`格式修饰符控制,该修饰符有以下几种格式: | `%%` | 插入一个百分号(`%`) | | --- | --- | | `%p` | 插入虚拟主机的端口号 | | `%N.M` | 插入名称(或者名称的一部分) | `N`和`M`被用来指定name中的子字符串。`N`从name中用小数点分隔的某部分中选取,而`M`是从`N`选中的字符串中选取部分字符。`M`是可选的且默认为"0";小数点当且仅当`M`存在时才必须书写。替换操作如下: | `0` | 整个name | | --- | --- | | `1` | 第一部分 | | `2` | 第二部分 | | `-1` | 最后一部分 | | `-2` | 倒数第二部分 | | `2+` | 从第二部分开始到最后的所有部分 | | `-2+` | 倒数第二部分以及之前的各部分 | | `1+`和`-1+` | 等同于`0` | 如果`N`或`M`大于部分的个数,则简单的用下划线来替换。 ## 示例 对于一个简单的基于名称的虚拟主机,配置文件中可能会使用下面的指令: ``` UseCanonicalName Off VirtualDocumentRoot /usr/local/apache/vhosts/%0 ``` 那么对`http://www.example.com/directory/file.html`的请求将会返回文件`/usr/local/apache/vhosts/www.example.com/directory/file.html` 对于拥有大量虚拟主机的情况而言,减少`vhosts`目录大小的一个好办法就是重新组织。为此你可以使用下面的配置: ``` UseCanonicalName Off VirtualDocumentRoot /usr/local/apache/vhosts/%3+/%2.1/%2.2/%2.3/%2 ``` 那么对`http://www.domain.example.com/directory/file.html`的请求将会返回文件`/usr/local/apache/vhosts/example.com/d/o/m/domain/directory/file.html` 进一步的分割可以用name尾字符来索引(hashing),例如: ``` VirtualDocumentRoot /usr/local/apache/vhosts/%3+/%2.-1/%2.-2/%2.-3/%2 ``` 该例返回文件`/usr/local/apache/vhosts/example.com/n/i/a/domain/directory/file.html` 也可以这样使用: ``` VirtualDocumentRoot /usr/local/apache/vhosts/%3+/%2.1/%2.2/%2.3/%2.4+ ``` 该例返回文件`/usr/local/apache/vhosts/example.com/d/o/m/ain/directory/file.html` 对于基于IP地址的虚拟主机,可以这样配置: ``` UseCanonicalName DNS VirtualDocumentRootIP /usr/local/apache/vhosts/%1/%2/%3/%4/docs VirtualScriptAliasIP /usr/local/apache/vhosts/%1/%2/%3/%4/cgi-bin ``` 对`http://www.domain.example.com/directory/file.html`的请求将会返回文件`/usr/local/apache/vhosts/10/20/30/40/docs/directory/file.html` ,这里假设`www.domain.example.com`的IP地址为10.20.30.40。对`http://www.domain.example.com/cgi-bin/script.pl`的请求将会执行程序`/usr/local/apache/vhosts/10/20/30/40/cgi-bin/script.pl` 如果你希望在`VirtualDocumentRoot`指令中包含点字符(`.`),但这又和`%`指令产生冲突,可以这样解决: ``` VirtualDocumentRoot /usr/local/apache/vhosts/%2.0.%3.0 ``` 对`http://www.domain.example.com/directory/file.html`的请求将会返回文件`/usr/local/apache/vhosts/domain.example/directory/file.html` `LogFormat`指令的`%V`和`%A`在和本模块的协同中起了一定作用。 ## VirtualDocumentRoot 指令 | [说明](#calibre_link-18) | 对于给定的基于名称的虚拟主机动态配置根文档目录 | | --- | --- | | [语法](#calibre_link-19) | `VirtualDocumentRoot _interpolated-directory_|none` | | [默认值](#calibre_link-24) | `VirtualDocumentRoot none` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 扩展(E) | | [模块](#calibre_link-22) | mod_vhost_alias | `VirtualDocumentRoot`指令使Apache可以通过虚拟主机的域名找到相应的文档。扩展_interpolated-directory_所得到的目录将会作为虚拟主机的根目录,这和`DocumentRoot`指令的参数是一样的。如果_interpolated-directory_为`none` ,那么`VirtualDocumentRoot`将被关闭。该指令不能和`VirtualDocumentRootIP`指令在同一作用域中使用。 ## VirtualDocumentRootIP 指令 | [说明](#calibre_link-18) | 对于给定的基于IP的虚拟主机动态配置根文档目录 | | --- | --- | | [语法](#calibre_link-19) | `VirtualDocumentRootIP _interpolated-directory_|none` | | [默认值](#calibre_link-24) | `VirtualDocumentRootIP none` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 扩展(E) | | [模块](#calibre_link-22) | mod_vhost_alias | `VirtualDocumentRootIP`与`VirtualDocumentRoot`相似,只是替换操作时用的不是虚拟主机名称,而是IP地址。 ## VirtualScriptAlias 指令 | [说明](#calibre_link-18) | 对于给定的基于名称的虚拟主机动态配置CGI目录 | | --- | --- | | [语法](#calibre_link-19) | `VirtualScriptAlias _interpolated-directory_|none` | | [默认值](#calibre_link-24) | `VirtualScriptAlias none` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 扩展(E) | | [模块](#calibre_link-22) | mod_vhost_alias | `VirtualScriptAlias`指令使Apache确定何处存放的是CGI脚本,这和`VirtualDocumentRoot`的做法是一样的。它匹配请求中的以`/cgi-bin/`开始的URI,更像"`ScriptAlias` `/cgi-bin/`"的作用。 ## VirtualScriptAliasIP 指令 | [说明](#calibre_link-18) | 对于给定的基于IP的虚拟主机动态配置CGI目录 | | --- | --- | | [语法](#calibre_link-19) | `VirtualScriptAliasIP _interpolated-directory_|none` | | [默认值](#calibre_link-24) | `VirtualScriptAliasIP none` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 扩展(E) | | [模块](#calibre_link-22) | mod_vhost_alias | `VirtualScriptAliasIP`和`VirtualScriptAlias`相似,只是替换操作使用的不是虚拟主机名称,而是IP地址。 ``