I want to cache on varnish solely based on cache control header. If public or max-age is mentioned, then page should be cached irrespective of cookie, In case of no-store or no-cache cache should bypass and proper session connection should be made with cookie. Not sure what I am doing wrong here.
sub vcl_recv {
if ( req.http.X-Force-Cache )
{
unset req.http.Cookie;
unset req.http.Cache-Control;
unset req.http.pragma;
unset req.http.ttl;
}
if (req.http.Authorization ) {
/* Not cacheable by default */
return (pass);
}
if (req.method == "POST" ) {
#set req.hash_always_miss = true;
return (pass);
}
}
sub vcl_hash {
if ( req.http.X-Force-Cache )
{
hash_data(req.http.X-Force-Cache);
}
}
sub vcl_backend_response {
if ( (beresp.http.Cache-control ~ "(no-cache|no-store)"))
{
#unset bereq.http.Cookie;
#unset beresp.http.Set-cookie;
unset bereq.http.X-Force-Cache;
}
elseif ( ( bereq.http.X-Force-Cache ) )
{
unset beresp.http.Set-cookie;
unset bereq.http.cookie;
unset beresp.http.cookie;
# unset beresp.http.Cache-Control;
unset bereq.http.X-Force-Cache;
set beresp.ttl = 7d;
unset beresp.http.Cache-Control;
}
else
{
unset beresp.http.Set-cookie;
unset bereq.http.cookie;
unset beresp.http.cookie;
# unset beresp.http.Cache-Control;
set bereq.http.X-Force-Cache = "1";
set beresp.ttl = 7d;
unset beresp.http.Cache-Control;
}
}
sub vcl_deliver {
if ( req.http.X-Force-Cache )
{
unset req.http.Cookie;
unset resp.http.Cookie;
unset resp.http.Set-cookie;
return(restart);
}
if (obj.hits > 0) { # Add debug header to see if it's a HIT/MISS and the number of hits, disable when not needed
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
set resp.http.X-Cache-Hits = obj.hits;
set resp.http.Mobile = req.http.CloudFront-Is-Mobile-Viewer;
set resp.http.X-Device = req.http.X-Device;
set resp.http.X-Force-Cache = req.http.X-Force-Cache;
}
I also would like to hide cache control header from user in case its cached.