regex matching on a cookie

Harish Sundararaj tuxtoti at
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: But there seems to
be a "space" between "[^;]" and "+" not sure why. Is that right?
3) Anything else that can be done better?


On Mon, Sep 3, 2012 at 9:04 PM, Harish Sundararaj <tuxtoti at> wrote:
> Hello,
> I have a URI like this:
> eg:
> 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