Varying by device type
Ruslan Sivak
russ at vshift.com
Thu Oct 14 06:42:25 CEST 2010
On 10/14/2010 12:26 AM, Ruslan Sivak wrote:
> On 10/14/2010 12:00 AM, Michael Alger wrote:
>> On Wed, Oct 13, 2010 at 11:48:52PM -0400, Ruslan Sivak wrote:
>>> We would like to vary by device type. We have code that detects this
>>> when the first page on the website gets hit and then sets a
>>> device_group cookie.
>>>
>>> I would like to have varnish cache these pages based on the value of
>>> the cookie. I can't seem to get it to work. Here is my code:
>>>
>>> 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,
>>> ";(device_group)=",
>>> "; \1=");
>>> set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*",
>>> "");
>>> set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[;
>>> ]+$", "");
>>>
>>> if (req.http.Cookie == "") {
>>> remove req.http.Cookie;
>>> }
>>> }
>>> }
>> Is that your entire/only vcl_recv? The default code, which is appended
>> to your own statements, includes:
>>
>> # if (req.http.Authorization || req.http.Cookie) {
>> # /* Not cacheable by default */
>> # return (pass);
>> # }
>>
>> which will obviously prevent any cache lookups being done if the client
>> has sent a Cookie header. You'll want to do return (lookup); at some
>> point to ensure the cache is checked, otherwise processing will go on
>> to the default code and you'll get a 'pass'.
>>
>> The default vcl_fetch has similar code to return (pass) if the server
>> has set a cookie, so you'll also want to override that.
>>
> So something like this then?
>
> 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,
> ";(device_group)=", "; \1=");
> set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
> set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$",
> "");
>
> if (req.http.Cookie == "") {
> remove req.http.Cookie;
> }
> return(lookup);
> }
> }
>
> sub vcl_fetch {
> set beresp.ttl=5d;
> if (beresp.http.set-cookie) {
> set beresp.http.set-cookie = ";" beresp.http.set-cookie;
> set beresp.http.set-cookie = regsuball(beresp.http.set-cookie, ";
> +", ";");
> set beresp.http.set-cookie = regsuball(beresp.http.set-cookie,
> ";(device_group)=", "; \1=");
> set beresp.http.set-cookie = regsuball(beresp.http.set-cookie,
> ";[^ ][^;]*", "");
> set beresp.http.set-cookie = regsuball(beresp.http.set-cookie,
> "^[; ]+|[; ]+$", "");
>
> if (beresp.http.set-cookie == "") {
> remove beresp.http.set-cookie;
> }
> return (deliver);
> }
> }
> sub vcl_hash { if (req.http.Cookie) { set req.hash += req.http.Cookie;
> } }
>
> It still doesn't seem to be working.
>
> RUss
>
Actually never mind, this does seem to be working.
Russ
More information about the varnish-misc
mailing list