On this page
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_alias或mod_userdir将 URI 转换为文件名,则它们将覆盖下面描述的mod_vhost_alias指令。例如,以下配置将在所有情况下将/cgi-bin/script.pl
Map 到/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
大于可用的 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.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,则文件/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 地址而不是服务器名称来进行目录插值。