Apache HTTP Server 版本 2.4

| 描述 | 在 Apache httpd 运行时配置文件中提供宏 |
|---|---|
| 状态 | 基础 |
| 模块标识符 | macro_module |
| 源文件 | mod_macro.c |
| 兼容性 | 在 httpd 2.4.5 及更高版本中可用 |
在 Apache httpd 运行时配置文件中提供宏,以简化创建大量类似配置块的过程。当服务器启动时,宏使用提供的参数进行扩展,结果与配置文件的其余部分一起处理。
宏使用 <Macro> 块定义,其中包含需要重复的配置部分,以及需要替换的那些部分的变量。
例如,您可以使用宏来定义一个 <VirtualHost> 块,以定义多个类似的虚拟主机
<Macro VHost $name $domain>
<VirtualHost *:80>
ServerName $domain
ServerAlias www.$domain
DocumentRoot "/var/www/vhosts/$name"
ErrorLog "/var/log/httpd/$name.error_log"
CustomLog "/var/log/httpd/$name.access_log" combined
</VirtualHost>
</Macro>
宏名称不区分大小写,与 httpd 配置指令一样。但是,变量名称区分大小写。
然后,您可以多次调用此宏来创建虚拟主机
Use VHost example example.com Use VHost myhost hostname.org Use VHost apache apache.org UndefMacro VHost
在服务器启动时,每个 Use 调用将扩展为一个完整的虚拟主机,如 <Macro> 定义中所述。
使用 UndefMacro 指令,以便以后使用相同变量名的宏不会导致定义冲突。
示例部分中可以看到此示例的更详细版本。
参数名称应以符号开头,例如 $、% 或 @,以便它们易于识别,并且为了帮助处理与其他指令的交互,例如核心 Define 指令。如果不这样做,将导致警告。但是,建议您了解整个服务器配置,以避免在不同范围内重复使用相同的变量,这会导致混淆。
以 $ 或 % 开头的参数不会转义。以 @ 开头的参数在引号中转义。
避免使用包含另一个参数作为前缀的参数(例如 $win 和 $winter),因为这可能会在表达式求值时造成混淆。如果发生此类混淆,将使用最长的可能参数名称。
如果您想在另一个字符串中使用值,将参数括在花括号中很有用,以避免混淆
<Macro DocRoot ${docroot}>
DocumentRoot "/var/www/${docroot}/htdocs"
</Macro>
mod_macro 的常见用法是创建动态生成的虚拟主机。
## Define a VHost Macro for repetitive configurations
<Macro VHost $host $port $dir>
Listen $port
<VirtualHost *:$port>
ServerName $host
DocumentRoot "$dir"
# Public document root
<Directory "$dir">
Require all granted
</Directory>
# limit access to intranet subdir.
<Directory "$dir/intranet">
Require ip 10.0.0.0/8
</Directory>
</VirtualHost>
</Macro>
## Use of VHost with different arguments.
Use VHost www.apache.org 80 /vhosts/apache/htdocs
Use VHost example.org 8080 /vhosts/example/htdocs
Use VHost www.example.fr 1234 /vhosts/example.fr/htdocs
建议您在使用宏后将其取消定义。这避免了在复杂的配置文件中出现变量名称冲突的混淆。
<Macro DirGroup $dir $group>
<Directory "$dir">
Require group $group
</Directory>
</Macro>
Use DirGroup /www/apache/private private
Use DirGroup /www/apache/server admin
UndefMacro DirGroup
| 描述 | 定义配置文件宏 |
|---|---|
| 语法 | <Macro name [par1 .. parN]> ... </Macro> |
| 上下文 | 服务器配置、虚拟主机、目录 |
| 状态 | 基础 |
| 模块 | mod_macro |
<Macro> 指令控制在服务器运行时配置文件中定义宏。第一个参数是宏的名称。其他参数是宏的参数。建议参数名称以 '$%@' 中的任何一个为前缀,而宏名称不要以这些字符为前缀。
<Macro LocalAccessPolicy>
Require ip 10.2.16.0/24
</Macro>
<Macro RestrictedAccessPolicy $ipnumbers>
Require ip $ipnumbers
</Macro>
| 描述 | 取消定义宏 |
|---|---|
| 语法 | UndefMacro name |
| 上下文 | 服务器配置、虚拟主机、目录 |
| 状态 | 基础 |
| 模块 | mod_macro |
UndefMacro 指令取消定义之前定义的宏。
UndefMacro LocalAccessPolicy UndefMacro RestrictedAccessPolicy
| 描述 | 使用宏 |
|---|---|
| 语法 | Use name [value1 ... valueN] |
| 上下文 | 服务器配置、虚拟主机、目录 |
| 状态 | 基础 |
| 模块 | mod_macro |
Use 指令控制宏的使用。指定的宏将被扩展。它必须与宏定义中提供的参数数量相同。提供的 value 与它们对应的初始参数相关联,并在处理之前进行替换。
Use LocalAccessPolicy ... Use RestrictedAccessPolicy "192.54.172.0/24 192.54.148.0/24"
等效于,使用上面定义的宏,
Require ip 10.2.16.0/24 ... Require ip 192.54.172.0/24 192.54.148.0/24