I saved a page before I noticed your reply and observed the same thing. I have saved it here for people to look at:
http://www.pixeljunkies.com/tests/sample.html
So, I've been thinking this through, and here are my thoughts.
I am indeed using ob_start ("ob_gzhandler"); in my PHP script to gzip the file. And my headers do occur in my script after this. However, no content is output until after my headers, and PHP doesn't send its headers until the first content is output, and the page was working fine for 6 months set up like that. So I highly doubt that the gzhandler occuring before my header()s is the problem, though I would gladly switch them around to test it.
Here's where it gets interesting. The page I linked to above, the sample.html, is the .php file I was promted to download when visiting a page on my site. The page, however, was in my passworded stats section. For stats I am using BBClone (http://bbclone.de/). So, I did a search through all of BBClone's files and it IS NOT using the ob_gzhandler.
This got me thinking, why the hell is it gzipped content? When looking at the headers appearing in the middle of sample.html, I searched BBClone's source to see how it sends its header, and they are not the same.
Hmmm. So, if you remember before, the only change I've made for months is the following addition to my .htaccess:
RewriteCond %{REQUEST_URI} .css$
RewriteRule ^(.+)$ css-ssc.php?css=%{REQUEST_URI}&%{QUERY_STRING}
Which routes all my CSS through a PHP file for processing. I opened up my css-ssc.php script and looked how it was sending its headers - again, no match to sample.html.
However, I have a script in /scripts/header.php, that I include at the top of all my pages in my site (except pages from external scripts, like the forum or stats).
In my header.php, I specifiy the following headers:
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Content-Type: text/html; charset=utf-8');
header('Vary: Accept');
Which appear to match exactly the headers in the middle of the page in sample.html.
So, this is absolutely confusing to me. I am in no way including my header.php in the stats package, which generated the page sample.html comes from. How could this be happening? Does this really have anything to do with mod_rewrite like Dreamhost says?
Thanks for your help, I feel good that I am at least getting somewhere.
My plan for now is to save any more pages that I get prompted to download and analyze them more. I can't get the server to do it right now, even though I just tried like two hundred pages.
Perhaps then I'll have some more information. Maybe I'll try posting on other forums, like the SitePoint forums.