regex matching on a cookie
Harish Sundararaj
tuxtoti at gmail.com
Mon Sep 3 19:52:24 UTC 2012
Hi all,
After a bit of head scratching, I came up with this:
1) Parse $integerA from the URI
2) Have two map blocks.
a) one to get $TermC from the cookie
b) one to map a backend based on the $TermC
Here is what I have got:
map $http_cookie $termC {
~adq_cnv(\d+)=($integer[^;]+#(\w{2}))(?:;|$) $3;
default "WX";
}
map $termC $backend {
WX w.x.y.z;
AB a.b.c.d;
}
location ~ ^/cnvpb/(\d+)/ {
set $cmpid $1;
proxy_pass http://$backend;
}
But unfortunately it fails saying - "invalid number of map
parameters". I think its something to do with variable interpolation.
So a few questions:
1) How do I substitute a variable inside a regex ?
2) The regex works with a if condition. I kind of extended it from
here: http://wiki.nginx.org/HttpRewriteModule#if. But there seems to
be a "space" between "[^;]" and "+" not sure why. Is that right?
3) Anything else that can be done better?
Thanks
Harish
On Mon, Sep 3, 2012 at 9:04 PM, Harish Sundararaj <tuxtoti at gmail.com> wrote:
> Hello,
>
> I have a URI like this:
>
> example.com/cnvpb/$IntegerA/$TermA
>
> eg:
> example.com/cnvpb/1233/Q4
>
> For this request , I might get cookies with names like
>
> abc_cnv1, abc_cnv2, abc_cnv3....abc_cnv5
>
> all or some of them. The value of these cookies are of the format:
>
> $integerB#$TermB#$integerC#$TermC
>
> Eg:
> 1234#blahblah#45#Q1
>
> Now this is the requirement:
>
> If for any of the cookies in abc_cnv[1-5], $integerA equals $intergerB
> choose an upstream based on $TermC.
>
> I have figured out few of things:
>
> 1) Parsing $integerA - Using a regex in the location block
> 2) Choosing an upstream based on $TermC - using a map block
>
> However, I'm stuck at reading cookies (not sure how to read only :
> abc_cnv[1-5]). I understand it can be done using multiple ifs .
> But I'm sure there should be a better way than that.
>
> Any pointers?
>
> Thanks
> Harish
More information about the nginx
mailing list