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:
- Use browser dev tools (Network tab) and check response headers for "Content-Encoding: gzip"
- Test with online tools like GIDZipTest or WebPageTest
- Check server logs for compression-related errors