Re: try_files и if

Maxim Dounin mdounin at mdounin.ru
Tue Feb 12 15:21:44 UTC 2013


Hello!

On Tue, Feb 12, 2013 at 03:35:34PM +0200, Roman wrote:

> 12.02.2013 12:41, Maxim Dounin пишет:
> >Hello!
> >
> >On Tue, Feb 12, 2013 at 10:10:36AM +0200, Roman wrote:
> >
> >>Добрый день,
> >>у меня имеется nginx version: nginx/1.0.12 и
> >>я конечно же читал сей замечательный документ :
> >>http://wiki.nginx.org/IfIsEvil
> >>
> >>Но очень хочется такого функционала:
> >>
> >>
> >>     map $http_referer $flag {
> >>         default 0;
> >>         "~*domain.com" 1;
> >>         ...
> >>         ...
> >>         }
> >>
> >>...
> >>
> >>         location ~* ^/([a-z0-9\-]+)/ {
> >>            try_files     $uri $uri/ /catalog/$1/best/index.html =404;
> >>            root /home/wwwroot;
> >>            if ($flag)
> >>            {
> >>                add_header Set-Cookie ...;
> >>            }
> >>
> >>         }
> >>Но естественно такой вариат с try_files & if не работает, сломал
> >>голову всю и никак не могу придумать альтернативного решения,
> >>может кто подскажет какую идею?
> >Сделать map вида:
> >
> >     map $flag $cookievalue {
> >         0     "";
> >         1     "...";
> >     }
> >
> >И дальше add_header безусловно:
> >
> >     add_header Set-Cookie $cookievalue;
> >
> >Если в результате map'а в переменной $cookievalue получится пустая
> >строка - соответствующий заголовок клиенту отослан не будет, если
> >получится непустая - будет, что, насколько я понимаю, и требуется
> >в задаче.
> >
> 
> Большущее спасибо,
> тогда, если можно, вот еще такой вопросик,
> 
> perl_set $uidset '
>         sub {
>             use Time::HiRes qw(gettimeofday);
>             ($sec,$milli) = gettimeofday;
>             return (($sec & 0x000FFFFF) << 8)+($milli & 0x000000FF)
> . ",".time();
>         }
> ';
> ...
> map $flag $cookievalue {
>     0 "";
>     1 "cookie1=$uidset; Max-Age=86400; path=/;";
> }
> в таком варианте при $flag = 1 в $cookievalue попадает срока как есть т.е.
> cookie1=$uidset; Max-Age=86400; path=/;
> 
> есть ли какие механизмы запихнуть в вычисляемое значение map
> ($cookievalue), уже посчитанное значение переменной $uidset?

В правой части map сейчас может быть либо строка, либо переменная 
(одна).  Соответственно для того, чтобы сделать строку, состоящую 
из переменных и текста, нужно делать это внешними по отношению к 
map'у средствами.  Если всё равно используется perl_set - я бы на 
нём всё это и сделал, и возвращал $cookievalue в нужном виде 
perl'ом.

Альтернативный вариант - сделать что-нибудь вроде

    map $flag $cookievalue {
        0     "";
        1     $uidset_cookie;
    }

и в соответствующем location'е

    set $uidset_cookie "cookie1=$uidset; Max-Age=86400; path=/;";

Но такое решение будет менее эффективно, т.к. set будет 
отрабатывать всегда, даже если $flag == 0.

-- 
Maxim Dounin
http://nginx.com/support.html



Подробная информация о списке рассылки nginx-ru