I have added the following line in my Apache httpd.conf: -
AddOutputFilterByType DEFLATE text/html text/css application/javascript application/x-javascript application/json
I have a html file (test.html) with a script inclusion: -
<script type="text/javascript" src="/test.js"></script>
The problem is, every time I load test.html, test.js is also loaded with HTTP status: 200.
The question is: Why conditional GET is not satisfied?
If I comment out the "AddOutputFilterByType" line in httpd.conf, Apache sends 304.
If I enable AddOutputFilterByType in httpd.conf, the request header is: -
Host: optimize User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 GTB5 (.NET CLR 3.5.30729) FirePHP/0.2.4 Accept: */* Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip, deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://optimize/ Cookie: PHPSESSID=nbq6h0eeahkshkcbc6ctu2j2b4 If-Modified-Since: Tue, 19 May 2009 07:06:46 GMT If-None-Match: "2000000000717f-2c25a-46a3e8dcc2ad8"-gzip Cache-Control: max-age=0
And the response header is: -
Date: Fri, 22 May 2009 07:03:40 GMT Server: Apache/2.2.9 (Win32) PHP/5.2.6 Last-Modified: Tue, 19 May 2009 07:06:46 GMT Etag: "2000000000717f-2c25a-46a3e8dcc2ad8"-gzip Accept-Ranges: bytes Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 52583 Keep-Alive: timeout=5, max=98 Connection: Keep-Alive Content-Type: application/javascript
UPDATE: I have noticed, if I am disabling ETag, it works properly. I mean it sends 304.
FileETag None
But I really want to keep ETag as it is (I know that there is a inode disclosure issue).
This problem still exists in Apache 2.4.23, so, I've written a better code than above to fix this issue. Expanation line by line:
1) If the browser sends a 'If-None-Match' request which has '-gzip' at the end, set variable request_etag=gzip.
2) Edit request header to strip out '-gzip' part.
3) Edit response header to add '-gzip' part, but only if the browser sent a '-gzip' request initially or response content is gzip encoded.
You can use either negative lookahead or negative lookbehind, regex speed is the same, Apache supports both
Test cases:
"2e2-5388f9f70c580-afeg"
"2e2-5388f9f70c580-gzin"
"2e2-5388f9f70c580-gzipd"
"2e2-5388f9f70c580-gzip"
"2e2-5388f9f70c580gzip"
I know this is a very old question, but it appears there's a more up-to-date answer.
To have Apache not append the
-gzip
suffix, you must use theDeflateAlterETag
directive with a value ofNoChange
.See the documentation for this here: http://httpd.apache.org/docs/trunk/mod/mod_deflate.html#deflatealteretag
Maybe you use a (squid) proxy which manipulates the HTTP Requests?
This is a known bug in Apache. See Apache bug #45023, and summary of Apache 304 etags and mod_deflate.
Rebuilding from svn will fix the issue. The resolution was to revert the change that appended "-gzip" to the etag. However, there are associated HTTP compliance problems.
If you can't rebuild Apache, there is a suggested runtime configuration workaround in the bug report: