Stripping the 'Vary: Host' header from an Apache response using Varnish
A colleague of mine found out that many static resource requests which should've been cached upstream by a CDN were not being cached, and the reason was an extra Vary
http header being sent with the response—in this case Host
.
It was hard to reproduce the issue, but in the end we found out it was related to Apache bug #58231. Basically, since we used some RewriteCond
s that evaluated the HTTP_HOST
value before a RewriteRule
, we ran into a bug where Apache would dump a Vary: Host
header into the request response. When this was set, it effectively bypassed Varnish's cache, as well as our upstream CDN... and since it applied to all image, css, js, xml, etc. requests, we saw a lot of unexpected volume hitting the backend Apache servers.
To fix the issue, at least until the upstream bug is fixed in Debian, we decided to strip Host
from the Vary
header inside our Varnish default.vcl. Inside the vcl_backend_response
, we added: