Can Varnish Set Cookies?

Travis Crowder travis.crowder at spechal.com
Sat Nov 19 06:35:52 CET 2011


Sorry, vcl_fetch() should be vcl_recv() ... I copy/pasted only the 
relevant parts and typed out the scopes. :\

On 11/18/2011 11:33 PM, Travis Crowder wrote:
> On 11/18/2011 2:55 PM, Jim Hayter wrote:
>> Travis wrote:
>> >  Sorry if this is on the ineternet somewhere, but I have yet to 
>> find it.
>>
>> >  Can Varnish set a cookie?
>>
>>> In example, if a user on a mobile device goes to xyz.com, Varnish 
>>> sees a
>>> mobile user agent and redirects them to m.xyz.com via the vcl_error
>>> section.  Before or after the redirect, can Varnish set a cookie 
>>> without
>>> the application doing so?
>>> Thanks,
>>> Travis
>> I'm running varnish 2.0.5 but would not expect the syntax to have 
>> changed much.
>> The obj part may no longer be what is used, I believe the current 
>> versions use beresp.
>>
>> I use the code below in vcl_fetch.
>>     If (test for setting cookie) {
>>     set obj.http.Set-Cookie = "use_mobile_dev=yes; 
>> domain=.<xxxxxxxx>.com; path=/";
>>     }
>>
>> This works for the limited case where I need it.  I don't remember 
>> the impact if any
>> Set-Cookie headers already exist.
>>
>> Jim
>
> Thank you!
>
> I am using this for mobile detection in case it can help anyone else.  
> It checks for either device=mobile or device=desktop in the query 
> string.  It works with = or / to be diverse in case my developers 
> decide to change it to use device/desktop or device/mobile in the future.
>
> vcl_fetch(){
>         # if they are accessing device/desktop, pass
>         if(req.url ~ "device(=|/)desktop") {
>                 if(req.http.Cookie ~ "view_type=mobile"){
>                         error 306 req.http.Host;
>                 }
>                 return(pass);
>         } elseif (req.url ~ "device(=|/)mobile" && req.http.Cookie ~ 
> "view_type=desktop") {
>                 error 305 req.http.host;
>         }
>         if(req.http.Cookie !~ "view_type" && req.http.Host !~ "^m\.") {
>                 if (
>                   req.http.User-Agent ~ "iPad" ||
>                   req.http.User-Agent ~ "iP(hone|od)" ||
>                   req.http.User-Agent ~ "Android" ||
>                   req.http.User-Agent ~ "SymbianOS" ||
>                   req.http.User-Agent ~ "^BlackBerry" ||
>                   req.http.User-Agent ~ "^SonyEricsson" ||
>                   req.http.User-Agent ~ "^Nokia" ||
>                   req.http.User-Agent ~ "^SAMSUNG" ||
>                   req.http.User-Agent ~ "^LG") {
>                         # Varnish can't really do redirects, so we 
> will error out
>                         # and have the error handler do the redirect
>                         error 305 req.http.host;
>                 }
>         }
> }
>
> vcl_error() {
>         if (obj.status == 305){
>                 set obj.http.Set-Cookie = "view_type=mobile; expires: 
> Session; path=/; domain=." obj.response;
>                 set obj.http.Location = "http://m." obj.response;
>                 set obj.status = 302;
>                 return(deliver);
>         }
>         if (obj.status == 306) {
>                 set obj.http.Set-Cookie = "view_type=desktop; expires: 
> Session; path=/; domain=." obj.response;
>                 set obj.http.Location = "http://" obj.response;
>                 set obj.status = 302;
>         }
>
> }
>
> _______________________________________________
> varnish-misc mailing list
> varnish-misc at varnish-cache.org
> https://www.varnish-cache.org/lists/mailman/listinfo/varnish-misc




More information about the varnish-misc mailing list