Re: Вопрос про map, переменные и аргументы
Валентин Бартенев
vbart на nginx.com
Ср Июл 15 10:58:35 UTC 2015
On Wednesday 15 July 2015 12:31:37 Michael Kechinov wrote:
> С предыдущим пунктом разобрался. Другая проблема - при POST-запросах
> и $r->request_body и $r->request_body_file пусты.
>
> POST-запрос:
>
> curl 'http://domain.com/push' -H 'Content-Type:
> application/x-www-form-urlencoded; charset=UTF-8' --data
> 'event=view&shop_id=f95342356fa619749015b7225f3b7db3&ssid=583c5f49-e86b-477b-98f9-87507bf0e3af&count=1&item_id%5B%5D=34753&price%5B%5D=14196&is_available%5B%5D=1'
>
> Конфигурация NGINX:
>
> http {
> perl_set $request_shop_id '
> sub {
> my $r = shift;
> if ($r->request_method eq "GET") {
> if($r->args =~ /shop_id=([a-z0-9A-Z]+)/ ) {
> return "$1";
> } else {
> return "";
> }
> } else {
> return $r->request_body;
> }
> }
> ';
> }
>
> В итоге, переменная $request_shop_id пуста.
>
> Где в итоге найти данные, переданные в запросе?
>
Так работать не будет. На момент perl_set тело еще не было прочитано.
Смотрите пример из $r->has_request_body:
http://nginx.org/ru/docs/http/ngx_http_perl_module.html#methods
--
Валентин Бартенев
>
>
>
> 2015-07-14 23:46 GMT+03:00 Michael Kechinov <sam на mkechinov.ru>:
>
> > С этим возникла проблема
> >
> > Собрал NGINX с perl'ом.
> > Читаю документацию http://nginx.org/ru/docs/http/ngx_http_perl_module.html
> > В ней написано, что "sub" может быть в контексте location
> > А "map" может быть только в контексте http.
> >
> > В итоге, это не работает, потому что тестирование конфига не проходит:
> > http {
> > sub {
> > my $r = shift;
> > my $ua = $r->header_in("User-Agent");
> > }
> >
> > add_header X-test "$ua";
> >
> > map_hash_max_size 8192;
> > map $arg_shop_id $api_shard {
> > include /home/rails/nginx_shop_mapping.conf;
> > }
> > }
> >
> > А это не работает, потому что маппинг происходит задолго до того, как
> > сработает перловая функция:
> >
> > http {
> >
> > server {
> > location {
> > sub {
> > my $r = shift;
> > my $ua = $r->header_in("User-Agent");
> > }
> >
> > add_header X-test "$ua";
> > }
> > }
> >
> > map_hash_max_size 8192;
> > map $arg_shop_id $api_shard {
> > include /home/rails/nginx_shop_mapping.conf;
> > }
> > }
> >
> >
> > Какой посоветуете выход?
> >
> >
> >
> >
> >
> >
> > 2015-07-10 12:01 GMT+03:00 Валентин Бартенев <vbart на nginx.com>:
> >
> >> On Friday 10 July 2015 10:10:04 Илья Шипицин wrote:
> >> > чтобы было, как вы хотите, надо чтобы nginx сначала принял запрос
> >> > полностью, извлек из тела параметр и только после этого спроксировал.
> >> > на практике nginx проксирует запрос постепенно.
> >> >
> >> [..]
> >>
> >> На практике он как раз сначала принимает весь запрос
> >> целиком, а потом только проксирует его на бэкенд, если
> >> конечно специально не выключить proxy_request_buffering:
> >> http://nginx.org/r/proxy_request_buffering
> >>
> >> Вытащить параметр из тела запроса можно с помощью
> >> встроенного перла:
> >> http://nginx.org/en/docs/http/ngx_http_perl_module.html
> >>
> >>
> >> --
> >> Валентин Бартенев
> >> _______________________________________________
> >> nginx-ru mailing list
> >> nginx-ru на nginx.org
> >> http://mailman.nginx.org/mailman/listinfo/nginx-ru
> >>
> >
> >
> >
> > --
> > *Michael Kechinov <http://linkedin.com/in/mkechinov>* | sam на mkechinov.ru |
> > +7 950 0099233
> > Startups development studio: mkechinov.ru | en <http://mkechinov.com>
> > Personalization for e-commerce: rees46.com
> > HackDay: hackday.ru
> > Twitter-wall: twijector.com
> >
>
>
>
> --
> *Michael Kechinov <http://linkedin.com/in/mkechinov>* | sam на mkechinov.ru |
> +7 950 0099233
> Startups development studio: mkechinov.ru | en <http://mkechinov.com>
> Personalization for e-commerce: rees46.com
> HackDay: hackday.ru
> Twitter-wall: twijector.com
>
Подробная информация о списке рассылки nginx-ru