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
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-misc

Reply via email to