summaryrefslogtreecommitdiffstats
path: root/docs/manual/mod/mod_proxy_html.html.en.utf8
blob: b37ee42298331153f33b4e64a93ccb049828365c (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
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
<!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>mod_proxy_html - Apache HTTP Server Version 2.5</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" />
<script src="../style/scripts/prettify.min.js" type="text/javascript">
</script>

<link href="../images/favicon.ico" rel="shortcut icon" /></head>
<body>
<div id="page-header">
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p>
<p class="apache">Apache HTTP Server Version 2.5</p>
<img alt="" src="../images/feather.png" /></div>
<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
<div id="path">
<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.5</a> &gt; <a href="./">Modules</a></div>
<div id="page-content">
<div id="preamble"><h1>Apache Module mod_proxy_html</h1>
<div class="toplang">
<p><span>Available Languages: </span><a href="../en/mod/mod_proxy_html.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/mod/mod_proxy_html.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a></p>
</div>
<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Rewrite HTML links in to ensure they are addressable
from Clients' networks in a proxy context.</td></tr>
<tr><th><a href="module-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">Module Identifier:</a></th><td>proxy_html_module</td></tr>
<tr><th><a href="module-dict.html#SourceFile">Source File:</a></th><td>mod_proxy_html.c</td></tr>
<tr><th><a href="module-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later.  Available as a third-party module
for earlier 2.x versions</td></tr></table>
<h3>Summary</h3>

<p>This module provides an output filter to rewrite HTML links in a
proxy situation, to ensure that links work for users outside the proxy.
It serves the same purpose as Apache's <code class="directive"><a href="../mod/mod_proxy.html#proxypassreverse">ProxyPassReverse</a></code> directive does
for HTTP headers, and is an essential component of a reverse proxy.</p>

<p>For example, if a company has an application server at
<code>appserver.example.com</code> that is only visible from within
the company's internal network, and a public webserver
<code>www.example.com</code>, they may wish to provide a gateway to the
application server at <code>http://www.example.com/appserver/</code>.
When the application server links to itself, those links need to be
rewritten to work through the gateway. <code class="module"><a href="../mod/mod_proxy_html.html">mod_proxy_html</a></code> serves to rewrite
<code>&lt;a href="http://appserver.example.com/foo/bar.html"&gt;foobar&lt;/a&gt;</code> to
<code>&lt;a href="http://www.example.com/appserver/foo/bar.html"&gt;foobar&lt;/a&gt;</code>
making it accessible from outside.</p>
</div>
<div id="quickview"><h3>Topics</h3>
<ul id="topics">
<li><img alt="" src="../images/down.gif" /> <a href="#intro">Introduction</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#custom">Customised HTML Parsing</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#i18n">Internationalisation</a></li>
</ul><h3 class="directives">Directives</h3>
<ul id="toc">
<li><img alt="" src="../images/down.gif" /> <a href="#proxyhtmlbufsize">ProxyHTMLBufSize</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#proxyhtmlcharsetout">ProxyHTMLCharsetOut</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#proxyhtmldoctype">ProxyHTMLDocType</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#proxyhtmlenable">ProxyHTMLEnable</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#proxyhtmlevents">ProxyHTMLEvents</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#proxyhtmlextended">ProxyHTMLExtended</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#proxyhtmlfixups">ProxyHTMLFixups</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#proxyhtmlinterp">ProxyHTMLInterp</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#proxyhtmllinks">ProxyHTMLLinks</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#proxyhtmlmeta">ProxyHTMLMeta</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#proxyhtmlstripcomments">ProxyHTMLStripComments</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#proxyhtmlurlmap">ProxyHTMLURLMap</a></li>
</ul>
<h3>Bugfix checklist</h3><ul class="seealso"><li><a href="https://www.apache.org/dist/httpd/CHANGES_2.4">httpd changelog</a></li><li><a href="https://bz.apache.org/bugzilla/buglist.cgi?bug_status=__open__&amp;list_id=144532&amp;product=Apache%20httpd-2&amp;query_format=specific&amp;order=changeddate%20DESC%2Cpriority%2Cbug_severity&amp;component=mod_proxy_html">Known issues</a></li><li><a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2&amp;component=mod_proxy_html">Report a bug</a></li></ul><h3>See also</h3>
<ul class="seealso">
<li><a href="#comments_section">Comments</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="intro" id="intro">Introduction</a> <a title="Permanent link" href="#intro" class="permalink">&para;</a></h2>
<p>mod_proxy_html was originally a third-party module for Apache HTTPD
2.0.x and later versions.  It was donated to the ASF in 2011 along with
<code class="module"><a href="../mod/mod_xml2enc.html">mod_xml2enc</a></code> (see <a href="#i18n">Internationalisation</a>)
and is a standard module in HTTPD 2.4 and development versions.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="custom" id="custom">Customised HTML Parsing</a> <a title="Permanent link" href="#custom" class="permalink">&para;</a></h2>
<p>Internally, mod_proxy_html uses the HTMLParser module from the
third-party <a href="http://xmlsoft.org/">libxml2</a> library.
Unlike other libxml2 parsers, HTMLParser deals with HTML without
requiring it to be well-formed XML. In particular, it understands
about implied tags - like a closing &lt;/p&gt; - and inserts them
into the stream of SAX events used by mod_proxy_html.  It also has
explicit knowledge of W3C standards HTML 4 and XHTML 1, and can
correct certain errors in them.</p>
<p>mod_proxy_html offers a range of options to control HTML parsing.
Error correction can be enabled (to your choice of HTML standard)
or disabled using <code class="directive">ProxyHTMLDocType</code>.
And in response to popular demand, it can be configured
to treat non-standard elements and attributes as links that may
need rewriting, and to rewrite links in embedded non-HTML contents
(stylesheets and scripts).  Note that it is not suitable for external
stylesheets or scripts: for those you should use another parser such as
<code class="module"><a href="../mod/mod_substitute.html">mod_substitute</a></code> or <code class="module"><a href="../mod/mod_sed.html">mod_sed</a></code>.
The main customisation directives are <code class="directive">ProxyHTMLLinks</code>
and <code class="directive">ProxyHTMLEvents</code>.  By default these are set in 
configuration file <var>proxy-html.conf</var>, which also contains
comments to help you customise your parser if required.</p>
<div class="note">For historical reasons, configuring mod_proxy_html to rewrite
URLs in scripting events does not by default rewrite URLs in stylesheets.
This can be changed by uncommenting the relevant line in
<var>proxy-html.conf</var> as documented there.</div>

</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="section">
<h2><a name="i18n" id="i18n">Internationalisation</a> <a title="Permanent link" href="#i18n" class="permalink">&para;</a></h2>
<p>Internally, mod_proxy_html uses a smart HTML parser from the
third-party <a href="http://xmlsoft.org/">libxml2</a> library.
The parser uses Unicode (utf-8) internally.  This makes it a
somewhat-complex task to handle other encodings required to process
many non-English-language websites.  If this is not handled correctly,
websites that display non-ASCII characters in encodings other than
utf-8 (Unicode) will display incorrectly.</p>
<p>From the first release in 2003 to the donation to Apache in 2011,
internationalisation (i18n) support developed from near nothing to a
sophisticated framework capable of applying rules from HTTP, HTML and XML
to detect a document's encoding and handle it correctly.  However,
this processing was common to mod_proxy_html and other modules using
libxml2, so it made sense to move it to a separate module rather than
maintain it in multiple places.  That module is <code class="module"><a href="../mod/mod_xml2enc.html">mod_xml2enc</a></code>,
and must be loaded for i18n to work.</p>
<p>The interaction of mod_proxy_html with mod_xml2enc is too complex to
be configured using regular filter configuration, including
<code class="module"><a href="../mod/mod_filter.html">mod_filter</a></code> directives.  Thus while mod_proxy_html can
still be configured using regular filter directives, this will not support
i18n at all.  Instead, a new directive <code class="directive">ProxyHTMLEnable</code>
has been introduced to configure both mod_proxy_html's filter and mod_xml2enc.
It is recommended that you always use ProxyHTMLEnable even where i18n
support is not required. <strong>Note that this is a change from earlier
versions where filter directives were used to activate mod_proxy_html.</strong></p>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ProxyHTMLBufSize" id="ProxyHTMLBufSize">ProxyHTMLBufSize</a> <a name="proxyhtmlbufsize" id="proxyhtmlbufsize">Directive</a> <a title="Permanent link" href="#proxyhtmlbufsize" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets the buffer size increment for buffering inline scripts and
stylesheets.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ProxyHTMLBufSize <var>bytes</var></code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>ProxyHTMLBufSize 8192</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_html</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later; available as a third-party
for earlier 2.x versions</td></tr>
</table>
<p>In order to parse non-HTML content (stylesheets and scripts) embedded
in HTML documents, <code class="module"><a href="../mod/mod_proxy_html.html">mod_proxy_html</a></code>
has to read the entire script or stylesheet into a buffer.  This buffer will
be expanded as necessary to hold the largest script or stylesheet in a page,
in increments of <var>bytes</var> as set by this directive.</p>
<p>The default is 8192, and will work well for almost all pages.  However,
if you know you're proxying pages containing stylesheets and/or
scripts bigger than 8K (that is, for a single script or stylesheet,
NOT in total), it will be more efficient to set a larger buffer
size and avoid the need to resize the buffer dynamically during a request.
</p>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ProxyHTMLCharsetOut" id="ProxyHTMLCharsetOut">ProxyHTMLCharsetOut</a> <a name="proxyhtmlcharsetout" id="proxyhtmlcharsetout">Directive</a> <a title="Permanent link" href="#proxyhtmlcharsetout" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Specify a charset for mod_proxy_html output.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ProxyHTMLCharsetOut <var>Charset | *</var></code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_html</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later; available as a third-party
for earlier 2.x versions</td></tr>
</table>
<p>This selects an encoding for mod_proxy_html output.  It should not
normally be used, as any change from the default <code>UTF-8</code>
(Unicode - as used internally by libxml2) will impose an additional
processing overhead.  The special token <code>ProxyHTMLCharsetOut *</code>
will generate output using the same encoding as the input.</p>
<p>Note that this relies on <code class="module"><a href="../mod/mod_xml2enc.html">mod_xml2enc</a></code> being loaded.</p>
<div class="note">
<p>This does not support encoding HTML Entities.  If a document contains
characters that cannot be represented in the target charset, it will
fail and the document is likely to be corrupted.  This applies even if
such characters are represented as entities in the input document.</p>
</div>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ProxyHTMLDocType" id="ProxyHTMLDocType">ProxyHTMLDocType</a> <a name="proxyhtmldoctype" id="proxyhtmldoctype">Directive</a> <a title="Permanent link" href="#proxyhtmldoctype" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets an HTML or XHTML document type declaration.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ProxyHTMLDocType HTML|XHTML [Legacy]<br /><strong>OR</strong>
<br />ProxyHTMLDocType <var>fpi</var> [SGML|XML]<br /><strong>OR</strong>
<br />ProxyHTMLDocType html5<br /><strong>OR</strong>
<br />ProxyHTMLDocType auto</code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>ProxyHTMLDocType auto (2.5/trunk versions); no FPI (2.4.x)</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_html</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later; available as a third-party
for earlier 2.x versions</td></tr>
</table>
<p>In the first form, documents will be declared as HTML 4.01 or XHTML 1.0
according to the option selected.  This option also determines whether
HTML or XHTML syntax is used for output.   Note that the format of the
documents coming from the backend server is immaterial: the parser will
deal with it automatically.  If the optional second argument is set to
<code>Legacy</code>, documents will be declared "Transitional", an option that may
be necessary if you are proxying pre-1998 content or working with defective
authoring/publishing tools.</p>
<p>In the second form, it will insert your own FPI.  The optional second
argument determines whether SGML/HTML or XML/XHTML syntax will be used.</p>
<p>The third form declares documents as HTML 5.</p>
<p>The fourth form is new in HTTPD trunk and not yet available in released
versions, and uses libxml2's HTML parser to detect the doctype.</p>
<p>If the first form is used, mod_proxy_html
will also clean up the HTML to the specified standard.  It cannot
fix every error, but it will strip out bogus elements and attributes.
It will also optionally log other errors at <code class="directive"><a href="../mod/core.html#loglevel">LogLevel</a></code> Debug.</p>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ProxyHTMLEnable" id="ProxyHTMLEnable">ProxyHTMLEnable</a> <a name="proxyhtmlenable" id="proxyhtmlenable">Directive</a> <a title="Permanent link" href="#proxyhtmlenable" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Turns the proxy_html filter on or off.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ProxyHTMLEnable On|Off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>ProxyHTMLEnable Off</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_html</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later; available as a third-party
module for earlier 2.x versions.</td></tr>
</table>
    <p>A simple switch to enable or disable the proxy_html filter.
    If <code class="module"><a href="../mod/mod_xml2enc.html">mod_xml2enc</a></code> is loaded it will also automatically
    set up internationalisation support.</p>
    <p>Note that the proxy_html filter will only act on HTML data
    (Content-Type text/html or application/xhtml+xml) and when the
    data are proxied.  You can override this (at your own risk) by
    setting the <var>PROXY_HTML_FORCE</var> environment variable.</p>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ProxyHTMLEvents" id="ProxyHTMLEvents">ProxyHTMLEvents</a> <a name="proxyhtmlevents" id="proxyhtmlevents">Directive</a> <a title="Permanent link" href="#proxyhtmlevents" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Specify attributes to treat as scripting events.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ProxyHTMLEvents <var>attribute [attribute ...]</var></code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_html</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later; available as a third-party
module for earlier 2.x versions</td></tr>
</table>
<p>Specifies one or more attributes to treat as scripting events and
apply <code class="directive"><a href="#proxyhtmlurlmap">ProxyHTMLURLMap</a></code>s to where enabled.
You can specify any number of attributes in one or more
<code class="directive">ProxyHTMLEvents</code> directives.</p>
<p>Normally you'll set this globally.  If you set <code class="directive">ProxyHTMLEvents</code> in more than
one scope so that one overrides the other, you'll need to specify a complete
set in each of those scopes.</p>
<p>A default configuration is supplied in <var>proxy-html.conf</var>
and defines the events in standard HTML 4 and XHTML 1.  This can be
extended to apply to URLs embedded in CSS stylesheet attributes
by adding the <var>style</var> attribute to ProxyHTMLEvents, although
this is not enabled in the shipped default.</p>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ProxyHTMLExtended" id="ProxyHTMLExtended">ProxyHTMLExtended</a> <a name="proxyhtmlextended" id="proxyhtmlextended">Directive</a> <a title="Permanent link" href="#proxyhtmlextended" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Determines whether to fix links in inline scripts, stylesheets,
and scripting events.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ProxyHTMLExtended On|Off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>ProxyHTMLExtended Off</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_html</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later; available as a third-party
for earlier 2.x versions</td></tr>
</table>
<p>Set to <code>Off</code>, HTML links are rewritten according to the
<code class="directive"><a href="#proxyhtmlurlmap">ProxyHTMLURLMap</a></code> directives, but links appearing
in Javascript and CSS are ignored.</p>
<p>Set to <code>On</code>, all scripting events (as determined by
<code class="directive"><a href="#proxyhtmlevents">ProxyHTMLEvents</a></code>) and embedded scripts or
stylesheets are also processed by the <code class="directive"><a href="#proxyhtmlurlmap">ProxyHTMLURLMap</a></code>
rules, according to the flags set for each rule.  Since this requires more
parsing, performance will be best if you only enable it when strictly necessary.
</p><p>
You'll also need to take care over patterns matched, since the parser has no
knowledge of what is a URL within an embedded script or stylesheet.
In particular, extended matching of <code>/</code> is likely to lead to
false matches.
</p>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ProxyHTMLFixups" id="ProxyHTMLFixups">ProxyHTMLFixups</a> <a name="proxyhtmlfixups" id="proxyhtmlfixups">Directive</a> <a title="Permanent link" href="#proxyhtmlfixups" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Fixes for simple HTML errors.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ProxyHTMLFixups [lowercase] [dospath] [reset]</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_html</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later; available as a third-party
for earlier 2.x versions</td></tr>
</table>
<p>This directive takes one to three arguments as follows:</p>
<ul>
<li><code>lowercase</code> Urls are rewritten to lowercase</li>
<li><code>dospath</code> Backslashes in URLs are rewritten to forward slashes.</li>
<li><code>reset</code> Unset any options set at a higher level in the configuration.</li>
</ul>
<p>Take care when using these.  The fixes will correct certain authoring
mistakes, but risk also erroneously fixing links that were correct to start with.
Only use them if you know you have a broken backend server.</p>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ProxyHTMLInterp" id="ProxyHTMLInterp">ProxyHTMLInterp</a> <a name="proxyhtmlinterp" id="proxyhtmlinterp">Directive</a> <a title="Permanent link" href="#proxyhtmlinterp" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Enables per-request interpolation of
<code class="directive">ProxyHTMLURLMap</code> rules.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ProxyHTMLInterp On|Off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>ProxyHTMLInterp Off</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_html</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later; available as a third-party
for earlier 2.x versions</td></tr>
</table>
    <p>This enables per-request interpolation in
    <code class="directive"><a href="#proxyhtmlurlmap">ProxyHTMLURLMap</a></code> to- and from- patterns.</p>
    <p>If interpolation is not enabled, all rules are pre-compiled at startup.
    With interpolation, they must be re-compiled for every request, which
    implies an extra processing overhead.  It should therefore be
    enabled only when necessary.</p>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ProxyHTMLLinks" id="ProxyHTMLLinks">ProxyHTMLLinks</a> <a name="proxyhtmllinks" id="proxyhtmllinks">Directive</a> <a title="Permanent link" href="#proxyhtmllinks" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Specify HTML elements that have URL attributes to be rewritten.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ProxyHTMLLinks <var>element attribute [attribute2 ...]</var></code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_html</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later; available as a third-party
for earlier 2.x versions</td></tr>
</table>
<p>Specifies elements that have URL attributes that should be rewritten
using standard <code class="directive"><a href="#proxyhtmlurlmap">ProxyHTMLURLMap</a></code>s.
You will need one <code class="directive">ProxyHTMLLinks</code> directive per element,
but it can have any number of attributes.</p>
<p>Normally you'll set this globally.  If you set <code class="directive">ProxyHTMLLinks</code> in more than
one scope so that one overrides the other, you'll need to specify a complete
set in each of those scopes.</p>
<p>A default configuration is supplied in <var>proxy-html.conf</var>
and defines the HTML links for standard HTML 4 and XHTML 1.</p>
<div class="example"><h3>Examples from proxy-html.conf</h3><pre class="prettyprint lang-config">ProxyHTMLLinks  a          href
ProxyHTMLLinks  area       href
ProxyHTMLLinks  link       href
ProxyHTMLLinks  img        src longdesc usemap
ProxyHTMLLinks  object     classid codebase data usemap
ProxyHTMLLinks  q          cite
ProxyHTMLLinks  blockquote cite
ProxyHTMLLinks  ins        cite
ProxyHTMLLinks  del        cite
ProxyHTMLLinks  form       action
ProxyHTMLLinks  input      src usemap
ProxyHTMLLinks  head       profile
ProxyHTMLLinks  base       href
ProxyHTMLLinks  script     src for</pre>
</div>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ProxyHTMLMeta" id="ProxyHTMLMeta">ProxyHTMLMeta</a> <a name="proxyhtmlmeta" id="proxyhtmlmeta">Directive</a> <a title="Permanent link" href="#proxyhtmlmeta" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Turns on or off extra pre-parsing of metadata in HTML
<code>&lt;head&gt;</code> sections.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ProxyHTMLMeta On|Off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>ProxyHTMLMeta Off</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_html</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later; available as a third-party
module for earlier 2.x versions.</td></tr>
</table>
    <div class="note">
      <p>ProxyHTMLMeta was part of i18n support in earlier mod_proxy_html
      versions, including those for Apache HTTPD 2.0 and 2.2.
      That functionality has now been separated out into the separate
      module <code class="module"><a href="../mod/mod_xml2enc.html">mod_xml2enc</a></code>.  ProxyHTMLMeta no longer
      serves any purpose likely to be useful in an operational server,
      though it might serve as a testing/debugging aid for developers
      of software such as browsers.</p>
    </div>

    <p>This turns on or off pre-parsing of metadata in HTML
    <code>&lt;head&gt;</code> sections.</p>
      
    <p>Enabling <code class="directive">ProxyHTMLMeta</code> will parse all
    <code>&lt;meta http-equiv=...&gt;</code> declarations and convert
    them to real HTTP headers, in keeping with the original purpose
    of this form of the HTML &lt;meta&gt; element.</p>

    <div class="warning"><h3>Warning</h3>
      Because ProxyHTMLMeta promotes <strong>all</strong>
      <code>http-equiv</code> elements to HTTP headers, it is important that you
      only enable it in cases where you trust the HTML content as much as you
      trust the upstream server. If the HTML is controlled by bad actors, it
      will be possible for them to inject arbitrary, possibly malicious, HTTP
      headers into your server's responses.
    </div>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ProxyHTMLStripComments" id="ProxyHTMLStripComments">ProxyHTMLStripComments</a> <a name="proxyhtmlstripcomments" id="proxyhtmlstripcomments">Directive</a> <a title="Permanent link" href="#proxyhtmlstripcomments" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Determines whether to strip HTML comments.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ProxyHTMLStripComments On|Off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>ProxyHTMLStripComments Off</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_html</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later; available as a third-party
for earlier 2.x versions</td></tr>
</table>
<p>This directive will cause mod_proxy_html to strip HTML comments.
Note that this will also kill off any scripts or styles embedded in
comments (a bogosity introduced in 1995/6 with Netscape 2 for the
benefit of then-older browsers, but still in use today).
It may also interfere with comment-based processors such as SSI or ESI:
be sure to run any of those <em>before</em> mod_proxy_html in the
filter chain if stripping comments!</p>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="ProxyHTMLURLMap" id="ProxyHTMLURLMap">ProxyHTMLURLMap</a> <a name="proxyhtmlurlmap" id="proxyhtmlurlmap">Directive</a> <a title="Permanent link" href="#proxyhtmlurlmap" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Defines a rule to rewrite HTML links</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ProxyHTMLURLMap <var>from-pattern to-pattern [flags] [cond]</var></code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host, directory</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_html</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>Version 2.4 and later; available as a third-party
module for earlier 2.x versions.</td></tr>
</table>
<p>This is the key directive for rewriting HTML links. When parsing a document,
whenever a link target matches <var>from-pattern</var>, the matching
portion will be rewritten to <var>to-pattern</var>, as modified by any
flags supplied and by the 
<code class="directive"><a href="#proxyhtmlextended">ProxyHTMLExtended</a></code> directive.
Only the elements specified using
the <code class="directive"><a href="#proxyhtmllinks">ProxyHTMLLinks</a></code> directive
will be considered as HTML links.</p>

<p>The optional third argument may define any of the following
<strong>Flags</strong>.  Flags are case-sensitive.</p>
<dl>
<dt>h</dt>
<dd><p>Ignore HTML links (pass through unchanged)</p></dd>
<dt>e</dt>
<dd><p>Ignore scripting events (pass through unchanged)</p></dd>
<dt>c</dt>
<dd><p>Pass embedded script and style sections through untouched.</p></dd>

<dt>L</dt>
<dd><p>Last-match.  If this rule matches, no more rules are applied
(note that this happens automatically for HTML links).</p></dd>
<dt>l</dt>
<dd><p>Opposite to L.  Overrides the one-change-only default
behaviour with HTML links.</p></dd>
<dt>R</dt>
<dd><p>Use Regular Expression matching-and-replace.  <code>from-pattern</code>
is a regexp, and <code>to-pattern</code> a replacement string that may be
based on the regexp.  Regexp memory is supported: you can use brackets ()
in the <code>from-pattern</code> and retrieve the matches with $1 to $9
in the <code>to-pattern</code>.</p>

<p>If R is not set, it will use string-literal search-and-replace.
The logic is <em>starts-with</em> in HTML links, but
<em>contains</em> in scripting events and embedded script and style sections.
</p>
</dd>
<dt>x</dt>
<dd><p>Use POSIX extended Regular Expressions.  Only applicable with R.</p></dd>
<dt>i</dt>
<dd><p>Case-insensitive matching.  Only applicable with R.</p></dd>

<dt>n</dt>
<dd><p>Disable regexp memory (for speed).  Only applicable with R.</p></dd>
<dt>s</dt>
<dd><p>Line-based regexp matching.  Only applicable with R.</p></dd>
<dt>^</dt>
<dd><p>Match at start only.  This applies only to string matching
(not regexps) and is irrelevant to HTML links.</p></dd>
<dt>$</dt>
<dd><p>Match at end only.  This applies only to string matching
(not regexps) and is irrelevant to HTML links.</p></dd>
<dt>V</dt>
<dd><p>Interpolate environment variables in <code>to-pattern</code>.
A string of the form <code>${varname|default}</code> will be replaced by the
value of environment variable <code>varname</code>.  If that is unset, it
is replaced by <code>default</code>.  The <code>|default</code> is optional.</p>
<p>NOTE: interpolation will only be enabled if
<code class="directive"><a href="#proxyhtmlinterp">ProxyHTMLInterp</a></code> is <var>On</var>.</p>
</dd>

<dt>v</dt>
<dd><p>Interpolate environment variables in <code>from-pattern</code>.
Patterns supported are as above.</p>
<p>NOTE: interpolation will only be enabled if
<code class="directive"><a href="#proxyhtmlinterp">ProxyHTMLInterp</a></code> is <var>On</var>.</p>
</dd>
</dl>

<p>The optional fourth <strong>cond</strong> argument defines a condition
that will be evaluated per Request, provided
<code class="directive"><a href="#proxyhtmlinterp">ProxyHTMLInterp</a></code> is <var>On</var>.
If the condition evaluates FALSE the map will not be applied in this request.
If TRUE, or if no condition is defined, the map is applied.</p>
<p>A <strong>cond</strong> is evaluated by the <a href="../expr.html">Expression Parser</a>.  In addition, the simpler syntax of conditions
in mod_proxy_html 3.x for HTTPD 2.0 and 2.2 is also supported.</p>

</div>
</div>
<div class="bottomlang">
<p><span>Available Languages: </span><a href="../en/mod/mod_proxy_html.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/mod/mod_proxy_html.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a></p>
</div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Comments</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our <a href="https://httpd.apache.org/lists.html">mailing lists</a>.</div>
<script type="text/javascript"><!--//--><![CDATA[//><!--
var comments_shortname = 'httpd';
var comments_identifier = 'http://httpd.apache.org/docs/trunk/mod/mod_proxy_html.html';
(function(w, d) {
    if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
        d.write('<div id="comments_thread"><\/div>');
        var s = d.createElement('script');
        s.type = 'text/javascript';
        s.async = true;
        s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
        (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
    }
    else {
        d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
    }
})(window, document);
//--><!]]></script></div><div id="footer">
<p class="apache">Copyright 2023 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
    prettyPrint();
}
//--><!]]></script>
</body></html>