I was able to reproduce the curl + apache/tomcat behavior that you described
This is how I reproduced it (OS X El Capitan):
Tomcat
docker run -it --rm -p 8880:8080 tomcat:6.0
Apache
httpd -v Server version: Apache/2.4.18 (Unix) Server built: Feb 20 2016 20:03:19 httpd -l Compiled in modules: core.c mod_so.c http_core.c prefork.c
Apache configuration (fully):
Listen 80 LoadModule authz_user_module libexec/apache2/mod_authz_user.so LoadModule authz_core_module libexec/apache2/mod_authz_core.so LoadModule access_compat_module libexec/apache2/mod_access_compat.so LoadModule filter_module libexec/apache2/mod_filter.so LoadModule deflate_module libexec/apache2/mod_deflate.so LoadModule mime_module libexec/apache2/mod_mime.so LoadModule log_config_module libexec/apache2/mod_log_config.so LoadModule headers_module libexec/apache2/mod_headers.so LoadModule version_module libexec/apache2/mod_version.so LoadModule proxy_module libexec/apache2/mod_proxy.so LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so LoadModule unixd_module libexec/apache2/mod_unixd.so <IfModule unixd_module> User _www Group _www </IfModule> <IfModule mime_module> TypesConfig /private/etc/apache2/mime.types </IfModule> LogLevel debug <IfModule log_config_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common <IfModule logio_module> # You need to enable mod_logio.c to use %I and %O LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio </IfModule> CustomLog "/private/var/log/apache2/access_log" common </IfModule> ErrorLog "/private/var/log/apache2/error_log" TraceEnable off SetOutputFilter DEFLATE ProxyRequests Off ProxyPass /tomcat http://localhost:8880/ ProxyPassReverse /tomcat http://localhost:8880/ ProxyPass /other http://localhost:8001/ ProxyPassReverse /other http://localhost:8001/ DocumentRoot /Library/WebServer/Documents
Check
curl -I -H 'Accept-Encoding: gzip' 'http://localhost/tomcat' HTTP/1.1 200 OK Date: Sat, 13 Jan 2018 13:35:14 GMT Server: Apache-Coyote/1.1 Accept-Ranges: bytes ETag: W/"7454-1491118183000" Last-Modified: Sun, 02 Apr 2017 07:29:43 GMT Content-Type: text/html Content-Length: 7454 curl -I -H 'Accept-Encoding: gzip' 'http://localhost/index.html.en' HTTP/1.1 200 OK Date: Sat, 13 Jan 2018 13:35:25 GMT Server: Apache/2.4.18 (Unix) Last-Modified: Tue, 09 Jan 2018 04:51:20 GMT ETag: "45-56250aa712200-gzip" Accept-Ranges: bytes Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 65 Content-Type: text/html
As you can see, the result very closely matches your example
And here's the fun part
If I use a regular GET request instead of HEAD (via a browser or curl without -I) the answer is tomcats DOES GETS GZIPPED
curl -D - -H 'Accept-Encoding: gzip' 'http://localhost/tomcat' 2>/dev/null | strings HTTP/1.1 200 OK Date: Sat, 13 Jan 2018 13:37:19 GMT Server: Apache-Coyote/1.1 Accept-Ranges: bytes ETag: W/"7454-1491118183000-gzip" Last-Modified: Sun, 02 Apr 2017 07:29:43 GMT Content-Type: text/html Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 2526 (some junk)
Not sure why this is happening, it looks like Apache + mod_proxy / defate misbehavior on HEAD requests. If you say that everything is okay in Apache 2.2, I would suggest that this might be due to this setting
mod_deflate will now skip compression if it knows that the size overhead added by the compression is larger than the data to be compressed.
So, Id checks to see if the problem persists for GET requests in your case. If yes, provide even more detailed information about your setup so that your environment can be 100% replicated - a valid Docker file for apache and tomcat to isolate a possible environment mismatch would be nice