OK, consegui resolver isso. Como Martin F corretamente aponta, o Apache está chunking a resposta para o tamanho do conteúdo não é conhecido. Para muitas pessoas isso é desejável (a página carrega mais rápido). Isso tem um custo de não poder relatar o progresso do download.
Para aqueles que, como eu, querem realmente relatar o progresso do download, se você usa o suporte automático ao gzip do Apache ou do PHP, há pouco que você possa fazer. A solução é fazer isso manualmente. É mais fácil do que parece:
Se você está enviando arquivos inteiros, então este é um ótimo exemplo em PHP para forçar um único pedaço (com o Content-Length): link
Se você estiver enviando dados gerados, use gzencode para codificar seus dados, como na amostra acima. Um pré-requisito é que todos os seus dados de saída sejam armazenados em uma variável (você pode usar ob_start para ajudá-lo se precisar armazenar em buffer e, em seguida, obter o conteúdo do buffer).
// $replyBody is the entire contents of your reply
header("Content-Type: application/json"); // or whatever yours is
// checks if gzip is supported by client
$pack = true;
if(empty($_SERVER["HTTP_ACCEPT_ENCODING"]) || strpos($_SERVER["HTTP_ACCEPT_ENCODING"], 'gzip') === false)
{
$pack = false;
}
// if supported, gzips data
if($pack) {
header("Content-Encoding: gzip");
$replyBody = gzencode($replyBody, 9, FORCE_GZIP);
}
// compressed or not, sets the Content-Length
header("Content-Length: " . mb_strlen($replyBody, 'latin1'));
// outputs reply & exits
echo $replyBody;
exit;
E voila!
Outra grande vantagem de fazer isso sozinho é que você pode definir o nível de compactação. Isso é ótimo para meu aplicativo móvel, já que posso definir o nível mais alto de compactação (para que meus usuários paguem menos pelos dados!) - enquanto o servidor provavelmente usa apenas um nível médio de compactação para obter um melhor compromisso CPU / tamanho. Os níveis de compressão são algo que eu acredito que você só pode mudar se você pode editar o httpd.conf (que em hospedagem compartilhada, eu não posso).
Portanto, mantive minha diretiva DEFLATE .htaccess para tudo, mas meu aplicativo / json responde, que agora codifico da maneira acima.
Obrigado novamente Martin F, você me deu a faísca que eu precisava para resolver isso:)