Apache HTTP Server 2.4 版
描述 | 提供动态配置的大规模虚拟主机功能 |
---|---|
状态 | 扩展 |
模块标识符 | 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/"
此模块中的所有指令都将字符串插值到路径名中。插值的字符串(以下称为“名称”)可以是服务器名称(有关如何确定此名称的详细信息,请参见 UseCanonicalName
指令),也可以是服务器上虚拟主机的 IP 地址(以点分十进制格式表示)。插值由受 printf
启发的规范控制,这些规范具有多种格式
%% |
插入一个 % |
%p |
插入虚拟主机的端口号 |
%N.M |
插入(部分)名称 |
N
和 M
用于指定名称的子字符串。N
从名称的点分隔组件中选择,而 M
从 N
选择的任何内容中选择字符。M
是可选的,如果不存在则默认为零;只有当 M
存在时,点才必须存在。解释如下
0 |
整个名称 |
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
满足。
可以通过从名称末尾进行哈希来实现更均匀的文件分布,例如
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
可能会有益,它将始终生成域名和顶级域名,例如 example.com
,而不管附加到主机名的子域名数量如何。因此,您可以创建一个配置,将所有一级、二级或三级子域名都指向同一个目录
VirtualDocumentRoot "/usr/local/apache/vhosts/%-2.0.%-1.0"
在上面的示例中,www.example.com
以及 www.sub.example.com
或 example.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,则对 http://www.domain.example.com/directory/file.html
的请求将由文件 /usr/local/apache/vhosts/10/20/30/40/docs/directory/file.html
满足。对 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 interpolated-directory|none |
默认值 | VirtualDocumentRoot none |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_vhost_alias |
VirtualDocumentRoot
指令允许您根据服务器名称的值来确定 Apache HTTP Server 在哪里找到您的文档。扩展 interpolated-directory 的结果用作文档树的根目录,类似于 DocumentRoot
指令的参数。如果 interpolated-directory 为 none
,则 VirtualDocumentRoot
将被关闭。此指令不能与 VirtualDocumentRootIP
在同一个上下文中使用。
VirtualDocumentRoot
将覆盖您可能在相同上下文或子上下文中设置的任何 DocumentRoot
指令。在全局服务器范围内放置一个 VirtualDocumentRoot
将有效地覆盖以后定义的任何虚拟主机中的 DocumentRoot
指令,除非您在每个虚拟主机中将 VirtualDocumentRoot
设置为 None
。描述 | 为给定的虚拟主机动态配置文档根目录的位置 |
---|---|
语法 | VirtualDocumentRootIP interpolated-directory|none |
默认值 | VirtualDocumentRootIP none |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_vhost_alias |
VirtualDocumentRootIP
指令类似于 VirtualDocumentRoot
指令,只是它使用连接服务器端的 IP 地址进行目录插值,而不是服务器名称。
描述 | 为给定的虚拟主机动态配置 CGI 目录的位置 |
---|---|
语法 | VirtualScriptAlias interpolated-directory|none |
默认值 | VirtualScriptAlias none |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_vhost_alias |
VirtualScriptAlias
指令允许您确定 Apache httpd 在哪里找到 CGI 脚本,类似于 VirtualDocumentRoot
对其他文档所做的那样。它匹配以 /cgi-bin/
开头的 URI 的请求,就像 ScriptAlias
/cgi-bin/
一样。
描述 | 为给定的虚拟主机动态配置 CGI 目录的位置 |
---|---|
语法 | VirtualScriptAliasIP interpolated-directory|none |
默认值 | VirtualScriptAliasIP none |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_vhost_alias |
VirtualScriptAliasIP
指令类似于 VirtualScriptAlias
指令,只是它使用连接服务器端的 IP 地址进行目录插值,而不是服务器名称。