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