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