Apache 模块 mod_vhost_alias

Description:提供动态配置的大规模虚拟主机
Status:Extension
Module Identifier:vhost_alias_module
Source File:mod_vhost_alias.c

Summary

该模块通过允许将 IP 地址和/或 HTTP 请求的Host:Headers 用作路径名的一部分来确定要服务的文件,来创建动态配置的虚拟主机。这样可以轻松使用大量具有类似配置的虚拟主机。

Note

如果使用mod_aliasmod_userdir将 URI 转换为文件名,则它们将覆盖下面描述的mod_vhost_alias指令。例如,以下配置将在所有情况下将/cgi-bin/script.plMap 到/usr/local/apache2/cgi-bin/script.pl

ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"
VirtualScriptAlias "/never/found/%0/cgi-bin/"

目录名称插值

此模块中的所有指令都将字符串插入到路径名中。插值字符串(以下称为“名称”)可以是服务器名称(有关如何确定的详细信息,请参见UseCanonicalName指令)或服务器上虚拟主机的 IP(以点分四进制格式)。插值受printf启发的说明符控制,说明符具有多种格式:

%%插入%
%p插入虚拟主机的端口号
%N.M插入(部分)名称

NM用于指定名称的子字符串。 N从名称的点分隔部分中选择,而M在选择的N中选择字符。 M是可选的,如果不存在则默认为零;当且仅当M存在时,点必须存在。解释如下:

0全名
1第一部分
2第二部分
-1最后一部分
-2倒数第二部分
2+第二部分和所有后续部分
-2+倒数第二个及所有先前的部分
1+-1+0相同

如果NM大于可用的 Component 数,则会插入单个下划线。

Examples

对于基于名称的简单虚拟主机,可以在服务器配置文件中使用以下指令:

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满足。

通过从名称末尾开始进行散列,可以实现文件的更均匀分布,例如:

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

用户最常见的请求是能够将多个域指向多个文档根,而不必担心所请求的主机名的长度或部分数量。如果请求的主机名是sub.www.domain.example.com而不是www.domain.example.com,则使用%3 将导致文档根目录是/usr/local/apache/vhosts/domain.example.com/...而不是预期的example.com目录。在这种情况下,使用%-2.0.%-1.0组合将是有益的,它将始终产生域名和 tld,例如example.com,而与附加到主机名的子域的数量无关。这样,就可以进行配置,将所有第一,第二或第三级子域定向到同一目录:

VirtualDocumentRoot "/usr/local/apache/vhosts/%-2.0.%-1.0"

在上面的示例中,www.example.com以及www.sub.example.comexample.com都将指向/usr/local/apache/vhosts/example.com

对于基于 IP 的虚拟主机,您可以在配置文件中使用以下内容:

UseCanonicalName DNS
VirtualDocumentRootIP "/usr/local/apache/vhosts/%1/%2/%3/%4/docs"
VirtualScriptAliasIP  "/usr/local/apache/vhosts/%1/%2/%3/%4/cgi-bin"

如果www.domain.example.com的 IP 地址为 10.20.30.40,则文件/usr/local/apache/vhosts/10/20/30/40/docs/directory/file.html将满足对http://www.domain.example.com/directory/file.html的请求。通过执行程序/usr/local/apache/vhosts/10/20/30/40/cgi-bin/script.pl可以满足对http://www.domain.example.com/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 Directive

Description:动态配置给定虚拟主机的文档根目录位置
Syntax:VirtualDocumentRoot interpolated-directory|none
Default:VirtualDocumentRoot none
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_vhost_alias

VirtualDocumentRoot指令允许您基于服务器名称的值来确定 Apache HTTP Server 在何处可以找到您的文档。扩展* interpolated-directory 的结果以与DocumentRoot指令的参数类似的方式用作文档树的根。如果 interpolated-directory *是none,则VirtualDocumentRoot关闭。不能在与VirtualDocumentRootIP相同的上下文中使用此伪指令。

Note

VirtualDocumentRoot将覆盖您可能在相同上下文或子上下文中放置的所有DocumentRoot指令。除非在每个虚拟主机中将VirtualDocumentRoot设置为None,否则在以后定义的任何虚拟主机中将VirtualDocumentRoot放入全局服务器范围内将有效地覆盖DocumentRoot指令。

VirtualDocumentRootIP Directive

Description:动态配置给定虚拟主机的文档根目录位置
Syntax:VirtualDocumentRootIP interpolated-directory|none
Default:VirtualDocumentRootIP none
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_vhost_alias

VirtualDocumentRootIP伪指令与VirtualDocumentRoot伪指令类似,不同之处在于它使用连接服务器端的 IP 地址而不是服务器名称来进行目录插值。

VirtualScriptAlias Directive

Description:动态配置给定虚拟主机的 CGI 目录的位置
Syntax:VirtualScriptAlias interpolated-directory|none
Default:VirtualScriptAlias none
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_vhost_alias

VirtualScriptAlias指令使您可以确定 Apache httpd 在何处可以找到 CGI 脚本,类似于VirtualDocumentRoot对其他文档的查找方式。它匹配以/cgi-bin/开头的 URI 请求,就像ScriptAlias /cgi-bin/一样。

VirtualScriptAliasIP Directive

Description:动态配置给定虚拟主机的 CGI 目录的位置
Syntax:VirtualScriptAliasIP interpolated-directory|none
Default:VirtualScriptAliasIP none
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_vhost_alias

VirtualScriptAliasIP伪指令与VirtualScriptAlias伪指令类似,不同之处在于它使用连接服务器端的 IP 地址而不是服务器名称来进行目录插值。