Apache HTTP Server Version 2.4
Description: | Perform search and replace operations on response bodies |
---|---|
Status: | Extension |
Module Identifier: | substitute_module |
Source File: | mod_substitute.c |
Compatibility: | Available in Apache HTTP Server 2.2.7 and later |
mod_substitute
provides a mechanism to perform
both regular expression and fixed string substitutions on
response bodies.
Description: | Pattern to filter the response content |
---|---|
Syntax: | Substitute s/pattern/substitution/[infq] |
Context: | directory, .htaccess |
Override: | FileInfo |
Status: | Extension |
Module: | mod_substitute |
The Substitute
directive specifies a
search and replace pattern to apply to the response body.
The meaning of the pattern can be modified by using any combination of these flags:
i
n
n
flag forces the pattern to be treated
as a fixed string.f
f
flag causes mod_substitute to flatten the
result of a substitution allowing for later substitutions to
take place on the boundary of this one. This is the default.q
q
flag causes mod_substitute to not
flatten the buckets after each substitution. This can
result in much faster response and a decrease in memory
utilization, but should only be used if there is no possibility
that the result of one substitution will ever match a pattern
or regex of a subsequent one.<Location /> AddOutputFilterByType SUBSTITUTE text/html Substitute s/foo/bar/ni </Location>
If either the pattern or the substitution contain a slash character then an alternative delimiter should be used:
<Location /> AddOutputFilterByType SUBSTITUTE text/html Substitute "s|<BR */?>|<br />|i" </Location>
Backreferences can be used in the comparison and in the substitution, when regular expressions are used, as illustrated in the following example:
<Location /> AddOutputFilterByType SUBSTITUTE text/html # "foo=k,bar=k" -> "foo/bar=k" Substitute "s|foo=(\w+),bar=\1|foo/bar=$1" </Location>
A common use scenario for mod_substitute
is the
situation in which a front-end server proxies requests to a back-end
server which returns HTML with hard-coded embedded URLs that refer
to the back-end server. These URLs don't work for the end-user,
since the back-end server is unreachable.
In this case, mod_substutite
can be used to rewrite
those URLs into something that will work from the front end:
ProxyPass /blog/ http://internal.blog.example.com ProxyPassReverse /blog/ http://internal.blog.example.com/ Substitute "s|http://internal.blog.example.com/|http://www.example.com/blog/|i"
ProxyPassReverse
modifies any Location
(redirect) headers that are sent
by the back-end server, and, in this example,
Substitute
takes care of the rest of the problem by
fixing up the HTML response as well.