<div dir="ltr">С предыдущим пунктом разобрался. Другая проблема - при POST-запросах и $r->request_body и $r->request_body_file пусты.<div><br></div><div><div>POST-запрос:</div><div><br></div><div><font face="monospace, monospace">curl '<a href="http://domain.com/push">http://domain.com/push</a>' -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' </font><br></div><div><br></div><div>Конфигурация NGINX:</div><div><br></div><div><font face="monospace, monospace">http {</font></div><div><div><font face="monospace, monospace"> perl_set $request_shop_id '</font></div><div><font face="monospace, monospace"> sub {</font></div><div><font face="monospace, monospace"> my $r = shift;</font></div><div><font face="monospace, monospace"> if ($r->request_method eq "GET") {</font></div><div><font face="monospace, monospace"> if($r->args =~ /shop_id=([a-z0-9A-Z]+)/ ) {</font></div><div><font face="monospace, monospace"> return "$1";</font></div><div><font face="monospace, monospace"> } else {</font></div><div><font face="monospace, monospace"> return "";</font></div><div><font face="monospace, monospace"> }</font></div><div><font face="monospace, monospace"> } else {</font></div><div><font face="monospace, monospace"> return $r->request_body;</font></div><div><font face="monospace, monospace"> }</font></div><div><font face="monospace, monospace"> }</font></div><div><font face="monospace, monospace"> ';</font></div></div><div><font face="monospace, monospace">}</font></div><div><br></div><div>В итоге, переменная $request_shop_id пуста. </div><div><br></div><div>Где в итоге найти данные, переданные в запросе?</div></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-07-14 23:46 GMT+03:00 Michael Kechinov <span dir="ltr"><<a href="mailto:sam@mkechinov.ru" target="_blank">sam@mkechinov.ru</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">С этим возникла проблема<div><br></div><div>Собрал NGINX с perl'ом.</div><div>Читаю документацию <a href="http://nginx.org/ru/docs/http/ngx_http_perl_module.html" target="_blank">http://nginx.org/ru/docs/http/ngx_http_perl_module.html</a></div><div>В ней написано, что "sub" может быть в контексте location</div><div>А "map" может быть только в контексте http.</div><div><br></div><div>В итоге, это не работает, потому что тестирование конфига не проходит:</div><div><font face="monospace, monospace">http {</font></div><div><div><font face="monospace, monospace"> sub {</font></div><div><font face="monospace, monospace"> my $r = shift;</font></div><div><font face="monospace, monospace"> my $ua = $r->header_in("User-Agent");</font></div><div><font face="monospace, monospace"> }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"> add_header X-test "$ua";</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"> map_hash_max_size 8192;</font></div><div><font face="monospace, monospace"> map $arg_shop_id $api_shard {</font></div><div><font face="monospace, monospace"> include /home/rails/nginx_shop_mapping.conf;</font></div><div><font face="monospace, monospace"> }</font></div></div><div><font face="monospace, monospace">}</font></div><div><br></div><div>А это не работает, потому что маппинг происходит задолго до того, как сработает перловая функция:</div><div><br></div><div><div><font face="monospace, monospace">http {</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"> server {</font></div><div><font face="monospace, monospace"> location {</font></div><div><div><font face="monospace, monospace"> sub {</font></div><div><font face="monospace, monospace"> my $r = shift;</font></div><div><font face="monospace, monospace"> my $ua = $r->header_in("User-Agent");</font></div><div><font face="monospace, monospace"> }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"> add_header X-test "$ua";</font></div><div><font face="monospace, monospace"> }</font></div><div><font face="monospace, monospace"> }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"> map_hash_max_size 8192;</font></div><div><font face="monospace, monospace"> map $arg_shop_id $api_shard {</font></div><div><font face="monospace, monospace"> include /home/rails/nginx_shop_mapping.conf;</font></div><div><font face="monospace, monospace"> }</font></div></div><div><font face="monospace, monospace">}</font></div></div><div><br></div><div><br></div><div>Какой посоветуете выход?</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><div><div class="h5"><br><div class="gmail_quote">2015-07-10 12:01 GMT+03:00 Валентин Бартенев <span dir="ltr"><<a href="mailto:vbart@nginx.com" target="_blank">vbart@nginx.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span>On Friday 10 July 2015 10:10:04 Илья Шипицин wrote:<br>
> чтобы было, как вы хотите, надо чтобы nginx сначала принял запрос<br>
> полностью, извлек из тела параметр и только после этого спроксировал.<br>
> на практике nginx проксирует запрос постепенно.<br>
><br>
</span>[..]<br>
<br>
На практике он как раз сначала принимает весь запрос<br>
целиком, а потом только проксирует его на бэкенд, если<br>
конечно специально не выключить proxy_request_buffering:<br>
<a href="http://nginx.org/r/proxy_request_buffering" rel="noreferrer" target="_blank">http://nginx.org/r/proxy_request_buffering</a><br>
<br>
Вытащить параметр из тела запроса можно с помощью<br>
встроенного перла:<br>
<a href="http://nginx.org/en/docs/http/ngx_http_perl_module.html" rel="noreferrer" target="_blank">http://nginx.org/en/docs/http/ngx_http_perl_module.html</a><br>
<br>
<br>
--<br>
Валентин Бартенев<br>
<div><div>_______________________________________________<br>
nginx-ru mailing list<br>
<a href="mailto:nginx-ru@nginx.org" target="_blank">nginx-ru@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" rel="noreferrer" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a></div></div></blockquote></div><br><br clear="all"><div><br></div></div></div><span class="HOEnZb"><font color="#888888">-- <br><div><div dir="ltr"><b><a href="http://linkedin.com/in/mkechinov" target="_blank">Michael Kechinov</a></b> | <a href="mailto:sam@mkechinov.ru" target="_blank">sam@mkechinov.ru</a> | +7 950 0099233<br><div>Startups development studio: <a href="http://mkechinov.ru/" target="_blank">mkechinov.ru</a> | <a href="http://mkechinov.com" target="_blank">en</a></div><div>Personalization for e-commerce: <a href="http://rees46.com" target="_blank">rees46.com</a></div><div>HackDay: <a href="http://hackday.ru/" target="_blank">hackday.ru</a> <br>Twitter-wall: <a href="http://twijector.com" target="_blank">twijector.com</a></div></div></div>
</font></span></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><b><a href="http://linkedin.com/in/mkechinov" target="_blank">Michael Kechinov</a></b> | <a href="mailto:sam@mkechinov.ru" target="_blank">sam@mkechinov.ru</a> | +7 950 0099233<br><div>Startups development studio: <a href="http://mkechinov.ru/" target="_blank">mkechinov.ru</a> | <a href="http://mkechinov.com" target="_blank">en</a></div><div>Personalization for e-commerce: <a href="http://rees46.com" target="_blank">rees46.com</a></div><div>HackDay: <a href="http://hackday.ru/" target="_blank">hackday.ru</a> <br>Twitter-wall: <a href="http://twijector.com" target="_blank">twijector.com</a></div></div></div>
</div>