summaryrefslogtreecommitdiffstats
path: root/docs/manual/mod/mod_macro.xml
blob: 7dcb8505d1752ff504b45a354ee12552de1c9f43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
<?xml version="1.0"?>
<!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?>
<!-- $LastChangedRevision$ -->

<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<modulesynopsis metafile="mod_macro.xml.meta">

<name>mod_macro</name>
<description>Provides macros within apache httpd runtime configuration files</description>
<status>Base</status>
<sourcefile>mod_macro.c</sourcefile>
<identifier>macro_module</identifier>

<summary>

    <p>This modules provides macros within apache httpd runtime configuration files.
    These macros may have parameters. They are expanded when used (parameters are
    substituted by their values given as an argument), and the result is
    processed normally.</p>
</summary>

<section id="features"><title>Features</title>

<p>Definition of a macro:</p>

    <ul>
    <li> macro definition within a <directive type="section">Macro</directive> section, following
         the httpd configuration style.</li>
    <li> user defined names for the macro and its parameters.</li>
    <li> macro names are case-insensitive, like httpd directives.</li>
    <li> macro parameter names are case sensitive.</li>
    <li> macro parameters must have distinct names.</li>
    <li> error on empty parameter names.</li>
    <li> redefining a macro generates a warning.</li>
    <li> macro definitions can be nested... (but what for?)</li>
    <li> warn about unused macro parameters.</li>
    <li> warn about macro parameter names which prefix one another.</li>
    <li> warn if a parameter is not prefixed by any of '<code>$%@</code>'
         (good practice).</li>
    <li> the available prefixes help deal with interactions with other
         directives such as <directive module="core">Define</directive>.</li>
    <li> tip: it may be useful to define a macro parameter with surrounding
         braces, say <code>${foo}</code> so that the name can appear with
	 surrounding characters such as <code>bla${foo}bla</code>.</li>
    <li> warn about empty macro contents.</li>
    <li> warns if sections are not properly nested within a macro.
         (if it is detected so).</li>
    <li> the lexical scope of macro parameters is restricted to the macro text,
         it is not forwarded to includes for instance.</li>
    <li> arbitrary contents in macros.
         <p>It means you can put perl sections or whatever you like in a macro.
	 No assumption is made about the lexical structure (quotes, spaces or
         whatever) within the macro contents but to expect a set of
         backslash-continued independent lines.</p></li>
    </ul>

<p>Use of a macro:</p>

    <ul>
    <li> number of arguments must match the definition.</li>
    <li> all occurences of macro parameters are substituted by their values.</li>
    <li> in case of conflicts, the longest parameter name is chosen.</li>
    <li> macro expansion recursion is detected and stopped (error).</li>
    <li> warn about empty arguments when used.</li>
    <li> on errors, try to describe precisely where the error occured.</li>
    <li> <code>$</code> and <code>%</code>-prefixed parameters are not
          escaped.</li>
    <li> <code>@</code>-prefixed parameters are escaped in quotes.</li>
    </ul>

<p>Removal of a macro definition:</p>

   <ul>
   <li> the macro must be already defined.</li>
   </ul>

<highlight language="config">
&lt;Macro DirGroup $dir $group&gt;
  &lt;Directory $dir&gt;
    require group $group
  &lt;/Directory&gt;
&lt;/Macro&gt;

Use DirGroup /www/apache/private private
Use DirGroup /www/apache/server  admin

UndefMacro DirGroup
</highlight>

</section>

<section id="examples"><title>Examples</title>

<p>A common usage of <module>mod_macro</module> is for the creation of
dynamically-generated virtual hosts.</p>

<highlight language="config">
## Define a VHost Macro for repetitive configurations

&lt;Macro VHost $host $port $dir&gt;
  Listen $port
  &lt;VirtualHost *:$port&gt;

    ServerName $host
    DocumentRoot $dir

    &lt;Directory $dir&gt;
      # do something here...
    &lt;/Directory&gt;

    # limit access to intranet subdir.
    &lt;Directory $dir/intranet&gt;
      order deny,allow
      deny from all
      allow from 10.0.0.0/8
    &lt;/Directory&gt;
  &lt;/VirtualHost&gt;
&lt;/Macro&gt;

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

</section>

<!-- Macro -->
<directivesynopsis type="section">
<name>Macro</name>
<description>Define a configuration file macro</description>
<syntax>
&lt;Macro <var>name</var> [<var>par1</var> .. <var>parN</var>]&gt;
... &lt;/Macro&gt;</syntax>
<contextlist>
<context>server config</context>
<context>virtual host</context>
<context>directory</context>
</contextlist>

<usage>
    <p>The <directive>Macro</directive> directive controls the definition of
    a macro within the server runtime configuration files.
    The first argument is the name of the macro.
    Other arguments are parameters to the macro. It is good practice to prefix
    parameter names with any of '<code>$%@</code>', and not macro names
    with such characters.
    </p>

    <highlight language="config">
&lt;Macro LocalAccessPolicy&gt;
    Require ip 10.2.16.0/24
&lt;/Macro&gt;

&lt;Macro RestrictedAccessPolicy $ipnumbers&gt;
    Require ip $ipnumbers
&lt;/Macro&gt;
    </highlight>
</usage>
</directivesynopsis>

<!-- Use -->
<directivesynopsis>
<name>Use</name>
<description>Use a macro</description>
<syntax>Use <var>name</var> [<var>value1</var> ... <var>valueN</var>]
</syntax>
<contextlist>
<context>server config</context>
<context>virtual host</context>
<context>directory</context>
</contextlist>

<usage>
    <p>The <directive>Use</directive> directive controls the use of a macro.
    The specified macro is expanded. It must be given the same number of
    arguments than in the  macro definition. The provided values are
    associated to their corresponding initial parameters and are substituted
    before processing.</p>

    <highlight language="config">
Use LocalAccessPolicy
...
Use RestrictedAccessPolicy "192.54.172.0/24 192.54.148.0/24"
    </highlight>

    <p>is equivalent, with the macros defined above, to:</p>

    <highlight language="config">
Require ip 10.2.16.0/24
...
Require ip 192.54.172.0/24 192.54.148.0/24
    </highlight>
</usage>

</directivesynopsis>

<!-- UndefMacro -->
<directivesynopsis>
<name>UndefMacro</name>
<description>Undefine a macro</description>

<syntax>UndefMacro <var>name</var></syntax>
<contextlist>
<context>server config</context>
<context>virtual host</context>
<context>directory</context>
</contextlist>

<usage>
    <p>The <directive>UndefMacro</directive> directive undefines a macro
    which has been defined before hand.</p>

    <highlight language="config">
UndefMacro LocalAccessPolicy
UndefMacro RestrictedAccessPolicy
    </highlight>
</usage>
</directivesynopsis>
</modulesynopsis>