<!-- $LastChangedRevision$ -->
<!--
- Copyright 2002-2004 The Apache Software Foundation
-
- Licensed 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
+ 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
<p>This document describes the use of filters in Apache.</p>
</summary>
- <section id="filters">
- <title>Filters</title>
+ <section id="intro">
+ <title>Filtering in Apache 2</title>
<related>
<modulelist>
+ <module>mod_filter</module>
<module>mod_deflate</module>
<module>mod_ext_filter</module>
<module>mod_include</module>
+ <module>mod_charset_lite</module>
+ <module>mod_reflector</module>
+ <module>mod_buffer</module>
+ <module>mod_data</module>
+ <module>mod_ratelimit</module>
+ <module>mod_reqtimeout</module>
+ <module>mod_request</module>
+ <module>mod_sed</module>
+ <module>mod_substitute</module>
+ <module>mod_xml2enc</module>
+ <module>mod_proxy_html</module>
+ <module>mod_policy</module>
</modulelist>
<directivelist>
+ <directive module="mod_filter">FilterChain</directive>
+ <directive module="mod_filter">FilterDeclare</directive>
+ <directive module="mod_filter">FilterProtocol</directive>
+ <directive module="mod_filter">FilterProvider</directive>
<directive module="mod_mime">AddInputFilter</directive>
<directive module="mod_mime">AddOutputFilter</directive>
<directive module="mod_mime">RemoveInputFilter</directive>
<directive module="mod_mime">RemoveOutputFilter</directive>
+ <directive module="mod_reflector">ReflectorHeader</directive>
<directive module="mod_ext_filter">ExtFilterDefine</directive>
<directive module="mod_ext_filter">ExtFilterOptions</directive>
<directive module="core">SetInputFilter</directive>
</directivelist>
</related>
- <p>A <em>filter</em> is a process that is applied to data that
- is sent or received by the server. Data sent by clients to the
- server is processed by <em>input filters</em> while data sent
- by the server to the client is processed by <em>output
- filters</em>. Multiple filters can be applied to the data, and
- the order of the filters can be explicitly specified.</p>
-
- <p>Filters are used internally by Apache to perform functions such
- as chunking and byte-range request handling. In addition, modules
- can provide filters that are selectable using run-time
- configuration directives. The set of filters that apply to data
- can be manipulated with the
+<p>The Filter Chain is available in Apache 2.0 and higher,
+and enables applications to process incoming and outgoing data
+in a highly flexible and configurable manner, regardless of
+where the data comes from. We can pre-process incoming data,
+and post-process outgoing data, at will. This is basically
+independent of the traditional request processing phases.</p>
+<p class="figure">
+<img src="images/filter_arch.png" width="569" height="392" alt=
+"Filters can be chained, in a Data Axis orthogonal to request processing"
+/>
+</p>
+<p>Some examples of filtering in the standard Apache distribution are:</p>
+<ul>
+<li><module>mod_include</module>, implements server-side includes.</li>
+<li><module>mod_ssl</module>, implements SSL encryption (https).</li>
+<li><module>mod_deflate</module>, implements compression/decompression on the fly.</li>
+<li><module>mod_charset_lite</module>, transcodes between different character sets.</li>
+<li><module>mod_ext_filter</module>, runs an external program as a filter.</li>
+</ul>
+<p>Apache also uses a number of filters internally to perform
+functions like chunking and byte-range handling.</p>
+
+<p>A wider range of applications are implemented by third-party filter
+modules available from <a
+href="http://modules.apache.org/">modules.apache.org</a> and
+elsewhere. A few of these are:</p>
+
+<ul>
+<li>HTML and XML processing and rewriting</li>
+<li>XSLT transforms and XIncludes</li>
+<li>XML Namespace support</li>
+<li>File Upload handling and decoding of HTML Forms</li>
+<li>Image processing</li>
+<li>Protection of vulnerable applications such as PHP scripts</li>
+<li>Text search-and-replace editing</li>
+</ul>
+</section>
+
+<section id="smart">
+<title>Smart Filtering</title>
+<p class="figure">
+<img src="images/mod_filter_new.png" width="423" height="331"
+alt="Smart filtering applies different filter providers according to the state of request processing"/>
+</p>
+<p><module>mod_filter</module>, included in Apache 2.1 and later,
+enables the filter chain to be configured dynamically at run time.
+So for example you can set up a proxy to rewrite
+HTML with an HTML filter and JPEG images with a completely
+separate filter, despite the proxy having no prior information
+about what the origin server will send. This works by using a
+filter harness, that dispatches to different providers according
+to the actual contents at runtime. Any filter may be either
+inserted directly in the chain and run unconditionally, or
+used as a provider and inserted dynamically. For example,</p>
+<ul>
+<li>an HTML processing filter will only run if the content is
+text/html or application/xhtml+xml</li>
+<li>A compression filter will only run if the input is a
+compressible type and not already compressed</li>
+<li>A charset conversion filter will be inserted if a text
+document is not already in the desired charset</li>
+</ul>
+</section>
+
+<section id="service">
+
+<title>Exposing Filters as an HTTP Service</title>
+<p>Filters can be used to process content originating from the client in
+addition to processing content originating on the server using the
+<module>mod_reflector</module> module.</p>
+
+<p><module>mod_reflector</module> accepts POST requests from clients, and reflects
+the content request body received within the POST request back in the response,
+passing through the output filter stack on the way back to the client.</p>
+
+<p>This technique can be used as an alternative to a web service running within
+an application server stack, where an output filter provides the transformation
+required on the request body. For example, the <module>mod_deflate</module>
+module might be used to provide a general compression service, or an image
+transformation filter might be turned into an image transformation service.</p>
+
+</section>
+
+<section id="using">
+<title>Using Filters</title>
+<p>There are two ways to use filtering: Simple and Dynamic.
+In general, you should use one or the other; mixing them can
+have unexpected consequences (although simple Input filtering
+can be mixed freely with either simple or dynamic Output filtering).</p>
+<p>The Simple Way is the only way to configure input filters, and is
+sufficient for output filters where you need a static filter chain.
+Relevant directives are
<directive module="core">SetInputFilter</directive>,
<directive module="core">SetOutputFilter</directive>,
<directive module="mod_mime">AddInputFilter</directive>,
<directive module="mod_mime">AddOutputFilter</directive>,
<directive module="mod_mime">RemoveInputFilter</directive>, and
- <directive module="mod_mime">RemoveOutputFilter</directive>
- directives.</p>
-
- <p>The following user-selectable filters are currently provided
- with the Apache HTTP Server distribution.</p>
-
- <dl>
- <dt>INCLUDES</dt>
- <dd>Server-Side Includes processing by <module>mod_include</module></dd>
- <dt>DEFLATE</dt>
- <dd>Compress output before sending it to the client using
- <module>mod_deflate</module>
- </dd>
- </dl>
-
- <p>In addition, the module <module>mod_ext_filter</module> allows
- for external programs to be defined as filters.</p>
+ <directive module="mod_mime">RemoveOutputFilter</directive>.</p>
+
+<p>The Dynamic Way enables both static and flexible, dynamic configuration
+of output filters, as discussed in the <module>mod_filter</module> page.
+Relevant directives are
+ <directive module="mod_filter">FilterChain</directive>,
+ <directive module="mod_filter">FilterDeclare</directive>, and
+ <directive module="mod_filter">FilterProvider</directive>.</p>
+
+<p>One further directive <directive
+module="mod_filter">AddOutputFilterByType</directive> is still supported,
+but deprecated. Use dynamic configuration instead.</p>
+
</section>
</manualpage>