Optimal mod_deflate Configuration for Modern Browsers: Compression Settings for Text-Based Content Types


5 views

When configuring Apache's mod_deflate for optimal performance across modern browsers, we need to balance compression efficiency with browser compatibility. The module's default suggestion to compress only text/html, text/plain, and text/xml is quite conservative compared to what modern browsers can handle.

Based on current web standards and browser capabilities, here's an enhanced configuration that covers all text-based content while avoiding already-compressed formats:

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
    AddOutputFilterByType DEFLATE application/json
</IfModule>

While most modern browsers handle gzip compression well, we should still include legacy browser exceptions:

BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

Prevent double-compression of binary files that won't benefit from gzip:

SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png|pdf|zip|gz|bz2|rar|exe|mov|avi|mp[34g]|wmv)$ no-gzip dont-vary

Proper cache control for proxies is essential:

Header append Vary User-Agent env=!dont-vary

Here's the full optimized configuration that combines all these elements:

<IfModule mod_deflate.c>
    # Enable compression
    SetOutputFilter DEFLATE
    
    # Legacy browsers handling
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
    
    # Content types to compress
    AddOutputFilterByType DEFLATE text/html text/plain text/xml
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/xml application/xhtml+xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/javascript application/x-javascript
    AddOutputFilterByType DEFLATE application/json
    
    # Exclude already compressed content
    SetEnvIfNoCase Request_URI \
    \.(?:gif|jpe?g|png|pdf|zip|gz|bz2|rar|exe|mov|avi|mp[34g]|wmv)$ no-gzip dont-vary
    
    # Proper proxy handling
    Header append Vary User-Agent env=!dont-vary
</IfModule>

When implementing this configuration:

  • Test compression ratios for your specific content
  • Monitor CPU usage, especially on high-traffic servers
  • Consider using mod_deflate's compression level directive (1-9) to balance CPU vs bandwidth
  • Validate with tools like Google PageSpeed Insights or WebPageTest

Use these curl commands to test your setup:

curl -I -H "Accept-Encoding: gzip,deflate" http://yoursite.com | grep -i "content-encoding"
curl -I http://yoursite.com/image.jpg | grep -i "content-encoding"

Apache's mod_deflate module provides on-the-fly compression for web content, significantly reducing bandwidth usage and improving page load times. The key is finding the right balance between compression coverage and browser compatibility.

Based on extensive testing with Chrome, Firefox, Safari, Edge and modern IE versions, these are the optimal MIME types to compress:

AddOutputFilterByType DEFLATE \
    text/html \
    text/plain \
    text/xml \
    text/css \
    text/javascript \
    application/xml \
    application/xhtml+xml \
    application/javascript \
    application/x-javascript \
    application/json \
    application/ld+json \
    application/manifest+json \
    application/rss+xml \
    application/vnd.api+json \
    application/vnd.ms-fontobject \
    application/x-font-ttf \
    application/x-web-app-manifest+json \
    font/opentype \
    image/svg+xml

While Netscape 4.x issues are obsolete, we still need some browser-specific handling:

<IfModule mod_deflate.c>
    # Compress HTML, CSS, JavaScript, Text, XML and fonts
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
    AddOutputFilterByType DEFLATE application/x-font
    AddOutputFilterByType DEFLATE application/x-font-opentype
    AddOutputFilterByType DEFLATE application/x-font-otf
    AddOutputFilterByType DEFLATE application/x-font-truetype
    AddOutputFilterByType DEFLATE application/x-font-ttf
    AddOutputFilterByType DEFLATE application/x-javascript
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE font/opentype
    AddOutputFilterByType DEFLATE font/otf
    AddOutputFilterByType DEFLATE font/ttf
    AddOutputFilterByType DEFLATE image/svg+xml
    AddOutputFilterByType DEFLATE image/x-icon
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/javascript
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/xml

    # Exclude problematic browsers (mostly obsolete now)
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

    # Exclude compression for binaries and images
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico|zip|gz|gzip|bz2|sit|rar|exe|flv|swf|mp[34]|mov|avi|pdf|ttf|eot)$ no-gzip dont-vary
</IfModule>

For fine-tuning compression behavior:

# Compression level (1-9)
DeflateCompressionLevel 6

# Buffer size
DeflateBufferSize 8096

# Window size
DeflateWindowSize 15

# Memory level (1-9)
DeflateMemLevel 9

When working with reverse proxies (like your Tomcat setup):

<Location />
    SetOutputFilter DEFLATE
    # Ensure proper Vary header for caching
    Header append Vary User-Agent env=!dont-vary
</Location>

# For specific proxy paths
<Location /confluence>
    SetOutputFilter DEFLATE
    # Add specific MIME types if needed
    AddOutputFilterByType DEFLATE application/atom+xml
</Location>

To verify your configuration is working:

  1. Use browser dev tools (Network tab) and check response headers for "Content-Encoding: gzip"
  2. Test with online tools like GIDZipTest or WebPageTest
  3. Check server logs for compression-related errors