• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • mod_macro

    描述:在 apache httpd 运行时 configuration files 中提供宏
    状态:Base
    模块标识符:macro_module
    源文件:mod_macro.c
    兼容性:可在 httpd 2.4.5 及更高版本中使用

    摘要

    在 Apache httpd 运行时 configuration files 中提供宏,以简化创建大量类似 configuration 块的 process。当服务器启动时,使用提供的参数扩展宏,并将结果与 configuration 文件的 rest 一起处理。

    用法

    宏是使用<Macro>块定义的,其中包含需要重复的 configuration 部分,以及需要替换的那些部分的变量。

    对于 example,您可以使用宏来定义<VirtualHost>块,在 order 中定义多个类似的虚拟主机:

    <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>
    

    宏名称是 case-insensitive,类似于 httpd configuration 指令。但是,变量名称区分大小写。

    然后,您将多次调用此宏来创建虚拟主机:

    Use VHost example example.com
    Use VHost myhost hostname.org
    Use VHost apache apache.org
    
    UndefMacro VHost
    

    在服务器启动时 time,这些使用调用中的每一个都将扩展为完整的虚拟主机,如<Macro>定义所述。

    使用UndefMacro指令,以便后面使用相同变量名的宏不会导致定义冲突。

    下面在示例部分中可以看到该示例的更复杂的 version。

    小贴士

    参数名称应以$%@等符号开头,以便它们可以清楚地识别,并且还可以帮助处理与其他指令的交互,例如核心限定指令。否则将导致警告。但是,我们鼓励您充分了解 order 中的整个服务器 configuration,以避免在不同的范围内重用相同的变量,这可能会导致混淆。

    前缀为$%的参数不会被转义。带@的参数前缀用引号括起来。

    避免使用包含另一个参数作为前缀的参数(对于 example,$win$winter),因为这可能会导致表达式 evaluation time 混淆。在这种混淆的事件中,使用了最长的参数 name。

    如果要在另一个 string 中使用 value,将参数括在大括号中会很有用,以避免混淆:

    <Macro DocRoot ${docroot}>
        DocumentRoot "/var/www/${docroot}/htdocs"
    </Macro>
    

    例子

    虚拟主机定义

    mod_macro的 common 用法用于创建 dynamically-generated 虚拟主机。

    ## 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
    

    删除宏定义

    建议您在使用宏后取消定义宏。这避免了复杂的 configuration 文件中的混淆,其中变量名称可能存在冲突。

    <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>指令

    描述:定义 configuration 文件宏
    句法:<Macro name[par1 .. parN]>...</Macro>
    Context:server config,virtual host,目录
    状态:Base
    模块:mod_macro

    <Macro>指令控制服务器运行时 configuration files 中宏的定义。第一个参数是宏的 name。其他 arguments 是宏的参数。最好使用任何“$%@”前缀参数名称,而不是带有此类字符的宏名称。

    <Macro LocalAccessPolicy>
        Require ip 10.2.16.0/24
    </Macro>
    
    <Macro RestrictedAccessPolicy $ipnumbers>
        Require ip $ipnumbers
    </Macro>
    

    UndefMacro 指令

    描述:取消定义一个宏
    句法:UndefMacro name
    Context:server config,virtual host,目录
    状态:Base
    模块:mod_macro

    UndefMacro指令取消定义一个先前已定义的宏。

    UndefMacro LocalAccessPolicy
    UndefMacro RestrictedAccessPolicy
    

    使用指令

    描述:使用宏
    句法:Use name[value1 ... valueN]
    Context:server config,virtual host,目录
    状态:Base
    模块:mod_macro

    Use指令控制宏的使用。指定的宏已扩展。必须为它提供与宏定义中相同数量的 arguments。提供的值与其对应的初始参数相关联,并在处理之前被替换。

    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
    

    上篇:mod_lua

    下篇:mod_md