| <?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_deflate.xml.meta"> | |
| <name>mod_deflate</name> | |
| <description>Compress content before it is delivered to the | |
| client</description> | |
| <status>Extension</status> | |
| <sourcefile>mod_deflate.c</sourcefile> | |
| <identifier>deflate_module</identifier> | |
| <summary> | |
| <p>The <module>mod_deflate</module> module provides | |
| the <code>DEFLATE</code> output filter that allows output from | |
| your server to be compressed before being sent to the client over | |
| the network.</p> | |
| </summary> | |
| <seealso><a href="../filter.html">Filters</a></seealso> | |
| <section id="supportedencodings"><title>Supported Encodings</title> | |
| <p>The <code>gzip</code> encoding is the only one supported to ensure complete compatibility | |
| with old browser implementations. The <code>deflate</code> encoding is not supported, | |
| please check the <a href="https://zlib.net/zlib_faq.html#faq39">zlib's documentation</a> | |
| for a complete explanation. | |
| </p> | |
| </section> | |
| <section id="recommended"><title>Sample Configurations</title> | |
| <note type="warning"><title>Compression and TLS</title> | |
| <p>Some web applications are vulnerable to an information disclosure | |
| attack when a TLS connection carries deflate compressed data. For more | |
| information, review the details of the "BREACH" family of attacks.</p> | |
| </note> | |
| <p>This is a simple configuration that compresses common text-based content types.</p> | |
| <example><title>Compress only a few types</title> | |
| <highlight language="config"> | |
| AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript | |
| </highlight> | |
| </example> | |
| </section> | |
| <section id="enable"><title>Enabling Compression</title> | |
| <note type="warning"><title>Compression and TLS</title> | |
| <p>Some web applications are vulnerable to an information disclosure | |
| attack when a TLS connection carries deflate compressed data. For more | |
| information, review the details of the "BREACH" family of attacks.</p> | |
| </note> | |
| <section id="output"><title>Output Compression</title> | |
| <p>Compression is implemented by the <code>DEFLATE</code> | |
| <a href="../filter.html">filter</a>. The following directive | |
| will enable compression for documents in the container where it | |
| is placed:</p> | |
| <highlight language="config"> | |
| SetOutputFilter DEFLATE | |
| SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip | |
| </highlight> | |
| <p>If you want to restrict the compression to particular MIME types | |
| in general, you may use the <directive module="mod_filter" | |
| >AddOutputFilterByType</directive> directive. Here is an example of | |
| enabling compression only for the html files of the Apache httpd | |
| documentation:</p> | |
| <highlight language="config"> | |
| <Directory "/your-server-root/manual"> | |
| AddOutputFilterByType DEFLATE text/html | |
| </Directory> | |
| </highlight> | |
| <note><title>Note</title> | |
| The <code>DEFLATE</code> filter is always inserted after RESOURCE | |
| filters like PHP or SSI. It never touches internal subrequests. | |
| </note> | |
| <note><title>Note</title> | |
| There is an environment variable <code>force-gzip</code>, | |
| set via <directive module="mod_env">SetEnv</directive>, which | |
| will ignore the accept-encoding setting of your browser and will | |
| send compressed output. | |
| </note> | |
| </section> | |
| <section id="inflate"><title>Output Decompression</title> | |
| <p>The <module>mod_deflate</module> module also provides a filter for | |
| inflating/uncompressing a gzip compressed response body. In order to activate | |
| this feature you have to insert the <code>INFLATE</code> filter into | |
| the output filter chain using <directive module="core" | |
| >SetOutputFilter</directive> or <directive module="mod_mime" | |
| >AddOutputFilter</directive>, for example:</p> | |
| <highlight language="config"> | |
| <Location "/dav-area"> | |
| ProxyPass "http://example.com/" | |
| SetOutputFilter INFLATE | |
| </Location> | |
| </highlight> | |
| <p>This example will uncompress gzip-compressed output from example.com, so other | |
| filters can do further processing with it. | |
| </p> | |
| </section> | |
| <section id="input"><title>Input Decompression</title> | |
| <p>The <module>mod_deflate</module> module also provides a filter for | |
| decompressing a gzip compressed request body. In order to activate | |
| this feature you have to insert the <code>DEFLATE</code> filter into | |
| the input filter chain using <directive module="core" | |
| >SetInputFilter</directive> or <directive module="mod_mime" | |
| >AddInputFilter</directive>, for example:</p> | |
| <highlight language="config"> | |
| <Location "/dav-area"> | |
| SetInputFilter DEFLATE | |
| </Location> | |
| </highlight> | |
| <p>Now if a request contains a <code>Content-Encoding: | |
| gzip</code> header, the body will be automatically decompressed. | |
| Few browsers have the ability to gzip request bodies. However, | |
| some special applications actually do support request | |
| compression, for instance some <a | |
| href="https://www.webdav.org">WebDAV</a> clients.</p> | |
| <note type="warning"><title>Note on Content-Length</title> | |
| <p>If you evaluate the request body yourself, <em>don't trust | |
| the <code>Content-Length</code> header!</em> | |
| The Content-Length header reflects the length of the | |
| incoming data from the client and <em>not</em> the byte count of | |
| the decompressed data stream.</p> | |
| </note> | |
| </section> | |
| </section> | |
| <section id="proxies"><title>Dealing with proxy servers</title> | |
| <p>The <module>mod_deflate</module> module sends a <code>Vary: | |
| Accept-Encoding</code> HTTP response header to alert proxies that | |
| a cached response should be sent only to clients that send the | |
| appropriate <code>Accept-Encoding</code> request header. This | |
| prevents compressed content from being sent to a client that will | |
| not understand it.</p> | |
| <p>If you use some special exclusions dependent | |
| on, for example, the <code>User-Agent</code> header, you must | |
| manually configure an addition to the <code>Vary</code> header | |
| to alert proxies of the additional restrictions. For example, | |
| in a typical configuration where the addition of the <code>DEFLATE</code> | |
| filter depends on the <code>User-Agent</code>, you should add:</p> | |
| <highlight language="config"> | |
| Header append Vary User-Agent | |
| </highlight> | |
| <p>If your decision about compression depends on other information | |
| than request headers (<em>e.g.</em> HTTP version), you have to set the | |
| <code>Vary</code> header to the value <code>*</code>. This prevents | |
| compliant proxies from caching entirely.</p> | |
| <example><title>Example</title> | |
| <highlight language="config"> | |
| Header set Vary * | |
| </highlight> | |
| </example> | |
| </section> | |
| <section id="precompressed"><title>Serving pre-compressed | |
| content</title> | |
| <p>Since <module>mod_deflate</module> re-compresses content each | |
| time a request is made, some performance benefit can be derived by | |
| pre-compressing the content and telling <module>mod_deflate</module> to serve them | |
| without re-compressing them. This may be accomplished using a | |
| configuration like the following:</p> | |
| <highlight language="config"> | |
| <IfModule mod_headers.c> | |
| # Serve gzip compressed CSS and JS files if they exist | |
| # and the client accepts gzip. | |
| RewriteCond "%{HTTP:Accept-encoding}" "gzip" | |
| RewriteCond "%{REQUEST_FILENAME}\.gz" -s | |
| RewriteRule "^(.*)\.(css|js)" "$1\.$2\.gz" [QSA] | |
| # Serve correct content types, and prevent mod_deflate double gzip. | |
| RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1] | |
| RewriteRule "\.js\.gz$" "-" [T=text/javascript,E=no-gzip:1] | |
| <FilesMatch "(\.js\.gz|\.css\.gz)$"> | |
| # Serve correct encoding type. | |
| Header append Content-Encoding gzip | |
| # Force proxies to cache gzipped & | |
| # non-gzipped css/js files separately. | |
| Header append Vary Accept-Encoding | |
| </FilesMatch> | |
| </IfModule> | |
| </highlight> | |
| </section> | |
| <directivesynopsis> | |
| <name>DeflateFilterNote</name> | |
| <description>Places the compression ratio in a note for logging</description> | |
| <syntax>DeflateFilterNote [<var>type</var>] <var>notename</var></syntax> | |
| <contextlist><context>server config</context><context>virtual host</context> | |
| </contextlist> | |
| <usage> | |
| <p>The <directive>DeflateFilterNote</directive> directive | |
| specifies that a note about compression ratios should be attached | |
| to the request. The name of the note is the value specified for | |
| the directive. You can use that note for statistical purposes by | |
| adding the value to your <a href="../logs.html#accesslog" | |
| >access log</a>.</p> | |
| <example><title>Example</title> | |
| <highlight language="config"> | |
| DeflateFilterNote ratio | |
| LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate | |
| CustomLog "logs/deflate_log" deflate | |
| </highlight> | |
| </example> | |
| <p>If you want to extract more accurate values from your logs, you | |
| can use the <var>type</var> argument to specify the type of data | |
| left as a note for logging. <var>type</var> can be one of:</p> | |
| <dl> | |
| <dt><code>Input</code></dt> | |
| <dd>Store the byte count of the filter's input stream in the note.</dd> | |
| <dt><code>Output</code></dt> | |
| <dd>Store the byte count of the filter's output stream in the note.</dd> | |
| <dt><code>Ratio</code></dt> | |
| <dd>Store the compression ratio (<code>output/input * 100</code>) | |
| in the note. This is the default, if the <var>type</var> argument | |
| is omitted.</dd> | |
| </dl> | |
| <p>Thus you may log it this way:</p> | |
| <example><title>Accurate Logging</title> | |
| <highlight language="config"> | |
| DeflateFilterNote Input instream | |
| DeflateFilterNote Output outstream | |
| DeflateFilterNote Ratio ratio | |
| LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate | |
| CustomLog "logs/deflate_log" deflate | |
| </highlight> | |
| </example> | |
| </usage> | |
| <seealso><module>mod_log_config</module></seealso> | |
| </directivesynopsis> | |
| <directivesynopsis> | |
| <name>DeflateBufferSize</name> | |
| <description>Fragment size to be compressed at one time by zlib</description> | |
| <syntax>DeflateBufferSize <var>value</var></syntax> | |
| <default>DeflateBufferSize 8096</default> | |
| <contextlist><context>server config</context><context>virtual host</context> | |
| </contextlist> | |
| <usage> | |
| <p>The <directive>DeflateBufferSize</directive> directive specifies | |
| the size in bytes of the fragments that zlib should compress at one | |
| time. If the compressed response size is bigger than the one specified | |
| by this directive then httpd will switch to chunked encoding | |
| (HTTP header <code>Transfer-Encoding</code> set to <code>Chunked</code>), with the | |
| side effect of not setting any <code>Content-Length</code> HTTP header. This is particularly | |
| important when httpd works behind reverse caching proxies or when httpd is configured with | |
| <module>mod_cache</module> and <module>mod_cache_disk</module> because | |
| HTTP responses without any <code>Content-Length</code> header might not be cached. | |
| </p> | |
| </usage> | |
| </directivesynopsis> | |
| <directivesynopsis> | |
| <name>DeflateWindowSize</name> | |
| <description>Zlib compression window size</description> | |
| <syntax>DeflateWindowSize <var>value</var></syntax> | |
| <default>DeflateWindowSize 15</default> | |
| <contextlist><context>server config</context><context>virtual host</context> | |
| </contextlist> | |
| <usage> | |
| <p>The <directive>DeflateWindowSize</directive> directive specifies the | |
| zlib compression window size (a value between 1 and 15). Generally, the | |
| higher the window size, the higher can the compression ratio be expected.</p> | |
| </usage> | |
| </directivesynopsis> | |
| <directivesynopsis> | |
| <name>DeflateMemLevel</name> | |
| <description>How much memory should be used by zlib for compression</description> | |
| <syntax>DeflateMemLevel <var>value</var></syntax> | |
| <default>DeflateMemLevel 9</default> | |
| <contextlist><context>server config</context><context>virtual host</context> | |
| </contextlist> | |
| <usage> | |
| <p>The <directive>DeflateMemLevel</directive> directive specifies | |
| how much memory should be used by zlib for compression | |
| (a value between 1 and 9).</p> | |
| </usage> | |
| </directivesynopsis> | |
| <directivesynopsis> | |
| <name>DeflateCompressionLevel</name> | |
| <description>How much compression do we apply to the output</description> | |
| <syntax>DeflateCompressionLevel <var>value</var></syntax> | |
| <default>Zlib's default</default> | |
| <contextlist><context>server config</context><context>virtual host</context> | |
| </contextlist> | |
| <usage> | |
| <p>The <directive>DeflateCompressionLevel</directive> directive specifies | |
| what level of compression should be used, the higher the value, | |
| the better the compression, but the more CPU time is required to | |
| achieve this.</p> | |
| <p>The value must be between 1 (less compression) and 9 (more compression).</p> | |
| </usage> | |
| </directivesynopsis> | |
| <directivesynopsis> | |
| <name>DeflateInflateLimitRequestBody</name> | |
| <description>Maximum size of inflated request bodies</description> | |
| <syntax>DeflateInflateLimitRequestBody <var>value</var></syntax> | |
| <default>None, but LimitRequestBody applies after deflation</default> | |
| <contextlist><context>server config</context><context>virtual host</context> | |
| <context>directory</context><context>.htaccess</context></contextlist> | |
| <override>All</override> | |
| <compatibility>2.4.10 and later</compatibility> | |
| <usage> | |
| <p>The <directive>DeflateInflateLimitRequestBody</directive> directive | |
| specifies the maximum size of an inflated request body. If it is unset, | |
| <directive module="core">LimitRequestBody</directive> is applied to the | |
| inflated body. A value of <code>0</code> means no limit is applied | |
| to the inflated body size (but other limits such as | |
| <directive module="core">LimitRequestBody</directive> may still apply).</p> | |
| </usage> | |
| </directivesynopsis> | |
| <directivesynopsis> | |
| <name>DeflateInflateRatioLimit</name> | |
| <description>Maximum inflation ratio for request bodies</description> | |
| <syntax>DeflateInflateRatioLimit <var>value</var></syntax> | |
| <default>DeflateInflateRatioLimit 200</default> | |
| <contextlist><context>server config</context><context>virtual host</context> | |
| <context>directory</context><context>.htaccess</context></contextlist> | |
| <override>All</override> | |
| <compatibility>2.4.10 and later</compatibility> | |
| <usage> | |
| <p>The <directive>DeflateInflateRatioLimit</directive> directive | |
| specifies the maximum ratio of deflated to inflated size of an | |
| inflated request body. This ratio is checked as the body is | |
| streamed in, and if crossed more than | |
| <directive module="mod_deflate">DeflateInflateRatioBurst</directive> | |
| times, the request will be terminated.</p> | |
| </usage> | |
| </directivesynopsis> | |
| <directivesynopsis> | |
| <name>DeflateInflateRatioBurst</name> | |
| <description>Maximum number of times the inflation ratio for request bodies | |
| can be crossed</description> | |
| <syntax>DeflateInflateRatioBurst <var>value</var></syntax> | |
| <default>DeflateInflateRatioBurst 3</default> | |
| <contextlist><context>server config</context><context>virtual host</context> | |
| <context>directory</context><context>.htaccess</context></contextlist> | |
| <override>All</override> | |
| <compatibility>2.4.10 and later</compatibility> | |
| <usage> | |
| <p>The <directive>DeflateInflateRatioBurst</directive> directive | |
| specifies the maximum number of times the | |
| <directive module="mod_deflate">DeflateInflateRatioLimit</directive> can | |
| be crossed before terminating the request.</p> | |
| </usage> | |
| </directivesynopsis> | |
| <directivesynopsis> | |
| <name>DeflateAlterETag</name> | |
| <description>How the outgoing ETag header should be modified during compression</description> | |
| <syntax>DeflateAlterETag AddSuffix|NoChange|Remove</syntax> | |
| <default>DeflateAlterETag AddSuffix</default> | |
| <contextlist><context>server config</context><context>virtual host</context> | |
| </contextlist> | |
| <compatibility>Available in Apache 2.4.58 and later</compatibility> | |
| <usage> | |
| <p>The <directive>DeflateAlterETag</directive> directive specifies | |
| how the ETag header should be altered when a response is compressed.</p> | |
| <dl> | |
| <dt>AddSuffix</dt> | |
| <dd><p>Append the compression method onto the end of the ETag, causing | |
| compressed and uncompressed representations to have unique ETags. | |
| This has been the default since 2.4.0, but prevents serving | |
| "HTTP Not Modified" (304) responses to conditional requests for | |
| compressed content.</p></dd> | |
| <dt>NoChange</dt> | |
| <dd><p>Don't change the ETag on a compressed response. This was the default | |
| prior to 2.4.0, but does not satisfy the HTTP/1.1 property that all | |
| representations of the same resource have unique ETags.</p></dd> | |
| <dt>Remove</dt> | |
| <dd><p>Remove the ETag header from compressed responses. This prevents | |
| some conditional requests from being possible, but avoids the | |
| shortcomings of the preceding options.</p></dd> | |
| </dl> | |
| </usage> | |
| </directivesynopsis> | |
| </modulesynopsis> |