Caching issue

Poul-Henning Kamp phk at
Mon Mar 10 23:54:19 CET 2008

My guess is  that Vary processing is getting you:

Firefox sends:
	   12 RxHeader     c Accept-Encoding: gzip,deflate
which goes to the backend:
	   15 TxHeader     b Accept-Encoding: gzip,deflate
which the backend uses:
	   15 RxHeader     b Vary: Accept-Encoding
	   15 RxHeader     b Content-Encoding: gzip

Then IE sends:
	   12 RxHeader     c Accept-Encoding: gzip, deflate

Which you will notice, has a space between "gzip," and "deflate"
thus not matching the Vary string already on record in the
cached object.

Varnish requires exact matching, the logic to find out if they
match semantically is not trivial to implement.

You could try the following in vcl_recv:

	if (req.http.accept-encoding) {
		set req.http.accept-encoding = regsub(
		    "gzip, *", "gzip,");

to get rid of the space(s), but it is not guaranteed to get all cases.

Alternatively, the more brutal:

	if (req.http.accept-encoding ~ "gzip") {
		set req.http.accept-encoding = "gzip";
	} else {
		unset req.http.accept-encoding;

Will get the desired effect in all cases, provided your backend does
not attempt deflate as fallback.

And finally, giving up on gzip'ing in toto, which is probably a bad choice:

	unset req.http.accept-encoding;


Poul-Henning Kamp       | UNIX since Zilog Zeus 3.20
phk at FreeBSD.ORG         | TCP/IP since RFC 956
FreeBSD committer       | BSD since 4.3-tahoe    
Never attribute to malice what can adequately be explained by incompetence.

More information about the varnish-dev mailing list