I'm using Google Cloud CDN to cache an HTML page.
I've configured all the correct headers as per the docs, and the page is caching fine. Now, I want to change it so that it only caches when the request has no cookies, i.e. no cookie
header set.
My understanding was that this was simply a case of changing my origin server to add a vary: cookie
header to all responses for the page, then only adding the caching headers Cache-Control: public
and Cache-Control: max-age=300
when no cookie
header is set on the request.
However, this doesn't work. Using curl
I can see that all caching headers, the vary: cookie
header, are set as expected when I send requests with and without cookies, but I never get cache hits on the requests without cookies.
Digging into the Cloud CDN logs, I see that every request with no cookie
header has cacheFillBytes
populated with the same number as the response size - whereas it's not for the requests with a cookie
header set with a value (as expected).
So it appears like Cloud CDN is attempting to populate the cache as expected for requests with no cookies, it's just that I never get a cache hit - i.e. it's just cacheFillBytes
every time, cacheHit: true
never appears in the logs.
Has anyone come across anything similar? I've triple-checked all my headers for typos, and indeed just removing the vary: cookie
header makes caching work as expected, so I'm almost certain my configuration is right in terms of headers and what Cloud CDN considers cacheable.
Should Cloud CDN handle vary: cookie
like I'm expecting it to? The docs suggest it handles arbitrary vary headers. And if so, why would I see cacheFillBytes
on every request, with Cache-Control: public
and Cache-Control: max-age=300
set on the response, but then never see a cacheHit: true
on any subsequent request (I've tried firing hundreds with curl
in a loop, it really never hits, it's not just that I'm populating a few different edge caches)?
I filed a bug with Google and it turns out that, indeed, the documentation was wrong.
vary: cookie
is not supported by Cloud CDN
The docs have been updated - the only headers that can be used with vary
are Accept
, Accept-Encoding
and Origin
.