apache模块 mod_vhost_alias
| 说明 | 提供大批量虚拟主机的动态配置支持 | 
|---|---|
| 状态 | 扩展(E) | 
| 模块名 | vhost_alias_module | 
| 源文件 | 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 指令
| 说明 | 对于给定的基于名称的虚拟主机动态配置根文档目录 | 
|---|---|
| 语法 | VirtualDocumentRoot interpolated-directory|none | 
| 默认值 | VirtualDocumentRoot none | 
| 作用域 | server config, virtual host | 
| 状态 | 扩展(E) | 
| 模块 | mod_vhost_alias | 
VirtualDocumentRoot指令使Apache可以通过虚拟主机的域名找到相应的文档。扩展interpolated-directory所得到的目录将会作为虚拟主机的根目录,这和DocumentRoot指令的参数是一样的。如果interpolated-directory为none ,那么VirtualDocumentRoot将被关闭。该指令不能和VirtualDocumentRootIP指令在同一作用域中使用。

VirtualDocumentRootIP 指令
| 说明 | 对于给定的基于IP的虚拟主机动态配置根文档目录 | 
|---|---|
| 语法 | VirtualDocumentRootIP interpolated-directory|none | 
| 默认值 | VirtualDocumentRootIP none | 
| 作用域 | server config, virtual host | 
| 状态 | 扩展(E) | 
| 模块 | mod_vhost_alias | 
VirtualDocumentRootIP与VirtualDocumentRoot相似,只是替换操作时用的不是虚拟主机名称,而是IP地址。

VirtualScriptAlias 指令
| 说明 | 对于给定的基于名称的虚拟主机动态配置CGI目录 | 
|---|---|
| 语法 | VirtualScriptAlias interpolated-directory|none | 
| 默认值 | VirtualScriptAlias none | 
| 作用域 | server config, virtual host | 
| 状态 | 扩展(E) | 
| 模块 | mod_vhost_alias | 
VirtualScriptAlias指令使Apache确定何处存放的是CGI脚本,这和VirtualDocumentRoot的做法是一样的。它匹配请求中的以/cgi-bin/开始的URI,更像"ScriptAlias /cgi-bin/"的作用。

VirtualScriptAliasIP 指令
| 说明 | 对于给定的基于IP的虚拟主机动态配置CGI目录 | 
|---|---|
| 语法 | VirtualScriptAliasIP interpolated-directory|none | 
| 默认值 | VirtualScriptAliasIP none | 
| 作用域 | server config, virtual host | 
| 状态 | 扩展(E) | 
| 模块 | mod_vhost_alias | 
VirtualScriptAliasIP和VirtualScriptAlias相似,只是替换操作使用的不是虚拟主机名称,而是IP地址。