Retaining some cookies and receiving hits

Guillaume Quintard guillaume at varnish-software.com
Tue May 30 09:38:42 CEST 2017


Hi,

As you said, the hashing is only based on the URL (and host/ip), that means
that Varnish can cache "/account.html" with cookie "user=alice" and deliver
it to the request "/account.html" with cookie "user=bob", is that an issue?

I highly recommend using vmod cookie to avoid the regex madness. I'd also
extract the cookies into their own headers and hash them inconditionally,
giving something like:

sub vcl_recv {
    cookie.parse(req.http.cookie);
set req.http.cookie1 = cookie.get("COOKIE1");
set req.http.cookie2 = cookie.get("COOKIE2");
unset req.http.cookie;
}

sub vcl_hash {
    hash_data(req.http.cookie1);
    hash_data(req.http.cookie2);
}

-- 
Guillaume Quintard

On Tue, May 30, 2017 at 6:40 AM, sreeranj s <sreeranj4droid at gmail.com>
wrote:

> Let me reiterate the question.
>
> By default varnish will not cache if there is cookie present in request or
> a set-cookie value is there in server response. In the following case we
> have retained COOKIE1 and |COOKIE2, but can varnish  still caches the
> responses(I have the unset cookie  from backend responses), by returning
> hash in vcl recv. No changes in vcl_hash is made, so caching is based on
> req_url.
>
> Please advise on any issues on this approach.
>
> ***************************************
> sub vcl_recv {
>
>     if (req.http.Cookie) {
>         set req.http.Cookie = ";" + req.http.Cookie;
>         set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");
>         set req.http.Cookie = regsuball(req.http.Cookie, ";(COOKIE1|COOKIE2)=", "; \1=");
>         set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
>         set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");
>
>         if (req.http.Cookie == "") {
>             unset req.http.Cookie;
>
>             return(pass)
>         }
>       return(hash)
>
>      }}
>
> ***************************************
>
>
>
>
> On Mon, May 29, 2017 at 9:45 PM, sreeranj s <sreeranj4droid at gmail.com>
> wrote:
>
>> Hi,
>>
>> As per the link https://varnish-cache.org/docs
>> /4.0/users-guide/increasing-your-hitrate.html, following code will help
>> us to retain COOKIE1 and |COOKIE2, but strip other cookies. So COOKIE1 and
>> |COOKIE2 is send to backend. I have the following questions.
>>
>> 1) By default varnish will not cache if there is cookie present in
>> request or a set-cookie value is there in server response. In the following
>> case we have retained COOKIE1 and |COOKIE2, but I still have varnish caches
>> the responses(I have the unset cookie  from backend responses). Could you
>> please let me know the reason.
>>
>> 2) If the approach is ok, please advise on any issues are related to this
>> approach.
>>
>> 3) I am not adding any specific value in hash block, so requests are
>> cached only based on req-url or IP. hope that is right.
>>
>>
>> =================================
>>
>> sub vcl_recv {
>>     if (req.http.Cookie) {
>>         set req.http.Cookie = ";" + req.http.Cookie;
>>         set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");
>>         set req.http.Cookie = regsuball(req.http.Cookie, ";(COOKIE1|COOKIE2)=", "; \1=");
>>         set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
>>         set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");
>>
>>         if (req.http.Cookie == "") {
>>             unset req.http.Cookie;
>>         }
>>     }}
>>
>>
>> =================================
>>
>>
>
> _______________________________________________
> varnish-misc mailing list
> varnish-misc at varnish-cache.org
> https://www.varnish-cache.org/lists/mailman/listinfo/varnish-misc
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.varnish-cache.org/lists/pipermail/varnish-misc/attachments/20170530/f04b5f3e/attachment-0001.html>


More information about the varnish-misc mailing list