<div dir="ltr">Спасибо, попробуем!<div>Про внутреннее перенаправление я как-то вообще не задумывался.. сразу, как try_files отвалился как вариант - так и перестал думать.)</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Антиквариат, однако.</blockquote></blockquote><div>Помните ту часть, что про "<span style="font-family:arial,sans-serif;font-size:13.333333969116211px"> </span><span style="font-family:arial,sans-serif;font-size:13.333333969116211px">возможности повлиять на клиента нет</span>" ?</div>


<div>Вот она и есть виновница этого антиквариата =)</div><div class="gmail_extra"><br><br><div class="gmail_quote">3 сентября 2014 г., 15:00 пользователь  <span dir="ltr"><<a href="mailto:nginx-ru-request@nginx.org" target="_blank">nginx-ru-request@nginx.org</a>></span> написал:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Сообщения, предназначенные для списка рассылки nginx-ru, необходимо<br>
отправлять по адресу<br>
        <a href="mailto:nginx-ru@nginx.org" target="_blank">nginx-ru@nginx.org</a><br>
<br>
Для изменения параметров подписки вы можеже использовать веб-страницу<br>
        <a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a><br>
<br>
Для получения информации о том, как пользовать почтовым интерфейсом,<br>
отправьте письмо, в теле или теме которого будет слово 'help', по<br>
адресу:<br>
        <a href="mailto:nginx-ru-request@nginx.org" target="_blank">nginx-ru-request@nginx.org</a><br>
<br>
Адрес человека, ответственного за этот список рассылки:<br>
        <a href="mailto:nginx-ru-owner@nginx.org" target="_blank">nginx-ru-owner@nginx.org</a><br>
<br>
При ответе, пожалуйста, измение тему письма так, чтобы она была более<br>
содержательной чем "Re: Содержание дайджеста списка рассылки<br>
nginx-ru..."<br>
<br>Today's Topics:<br>
<br>
   1. Transparent file substitution (Андрей Середенко)<br>
   2. Re: Transparent file substitution (Maxim Dounin)<br>
<br><br>---------- Пересылаемое сообщение ----------<br>From: "Андрей Середенко" <<a href="mailto:andrei.seredenko@gmail.com" target="_blank">andrei.seredenko@gmail.com</a>><br>To: <a href="mailto:nginx-ru@nginx.org" target="_blank">nginx-ru@nginx.org</a><br>


Cc: <br>Date: Tue, 2 Sep 2014 17:20:00 +0300<br>Subject: Transparent file substitution<br><div dir="ltr">Доброго дня всем!<div><br></div><div>Ребят, подскажите - имеется такой вопрос..</div><div><br></div><div>INTRO: </div>


<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>Mono. Есть приложение, на которое nginx проксирует запросы. И есть один не-совсем-адекватный клиент, который у этого приложения запрашивает wsdl прежде, чем воспользоваться апишкой.. перед каждым запросом... и делает это с частотой ~200 запросов в минуту (на каждый полезный запрос - вот этот вот сорный запрос wsdl'ки, который впустую напрягает приложение)</div>




</blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>Возможности повлиять на клиента нет. Время подставлять костыли...</div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">




<div><br></div></blockquote><div>WORKAROUND:</div><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>Раз возможности повлиять на клиента нет, было принято решение обмануть его (нормальная практика, что =) ): вместо постоянной генерации wsdl'ки на стороне приложения - отдавать nginx'ом статический файл, содержащий её контент (если в параметрах запроса имеется ?wsdl, если его нет - то проксировать на приложение). Было сделано что-то вроде следующего:</div>




<div><br></div><div><div><span style="white-space:pre-wrap">              </span>location = /some/app/url/messenger.asmx {</div><div><span style="white-space:pre-wrap">                </span>    if ( $args ~* wsdl ) {</div><div><span style="white-space:pre-wrap">                     </span>return 301 /some/app/url/static/messengerwsdl.xml;<br>




</div><div><span style="white-space:pre-wrap">              </span>    }</div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>                    proxy_pass        <a href="http://server1:8080" target="_blank">http://server1:8080</a>;</div>




</blockquote></div><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><span style="white-space:pre-wrap">         </span>}</div></div><div><br></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">




где /some/app/url/static/ - смотрит на папку со статикой, обрабатываемую nginx'ом, а messengerwsdl.xml - тот самый файл с контентом wsdl'ки.<br>работало всё просто замечательно, но..<br><br></blockquote>PROBLEMS:</div>




<div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>..оказалось, что клиент, запрашивавший wsdl, не умеет работать с редиректом :( </div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">




<div>А т.к. повлиять на клиента возможности нет - пришлось чесать затылок.</div></blockquote></div><div><br></div>GOALS:<div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>Можно ли сделать нечто подобное <u>без перенаправлений</u> ? </div>




<div>Что пробовалось: положить файл в папку статики по пути, аналогичным location и с тем же именем, и поменять $document_root в блоке if'a, но: из if'a тоже надо как-то выходить - break не годится (обработка пойдет дальше по локейшену и в результате - запрос будет проксирован), return не годится (клиент не понимает редиректов), rewrite... а смысл? все равно в итоге return new location.</div>




</blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>В этом смысле, наверное, неплохо вписался бы try_files в блоке if'a... но он внутри директивы if запрещён.</div><div><br></div></blockquote>




Может, ещё какие-нибудь варианты? И могут ли они быть в принципе.</div><div>Если что-то было не ясно в описании - могу на псевдопримерах пояснить. А пока - вот:</div><div><div><br></div><div>#$ nginx -V</div><div>nginx version: nginx/1.0.15</div>




<div>built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) </div><div>TLS SNI support enabled</div><div>configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --with-mail --with-mail_ssl_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-ld-opt=-Wl,-E</div>




<div><br></div><div><div>#$ lsb_release -a</div><div>LSB Version:<span style="white-space:pre-wrap">  </span>:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch</div>




<div>Distributor ID:<span style="white-space:pre-wrap">   </span>CentOS</div><div>Description:<span style="white-space:pre-wrap">       </span>CentOS release 6.2 (Final)</div><div>Release:<span style="white-space:pre-wrap">       </span>6.2</div>




<div>Codename:<span style="white-space:pre-wrap"> </span>Final</div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><br></div><div><br></div></blockquote>Спасибо!<br><br></div></div>
<br><br>---------- Пересылаемое сообщение ----------<br>From: Maxim Dounin <<a href="mailto:mdounin@mdounin.ru" target="_blank">mdounin@mdounin.ru</a>><br>To: <a href="mailto:nginx-ru@nginx.org" target="_blank">nginx-ru@nginx.org</a><br>

Cc: <br>Date: Tue, 2 Sep 2014 18:34:19 +0400<br>
Subject: Re: Transparent file substitution<br>Hello!<br>
<br>
On Tue, Sep 02, 2014 at 05:20:00PM +0300, Андрей Середенко wrote:<br>
<br>
[...]<br>
<br>
> Можно ли сделать нечто подобное *без перенаправлений* ?<br>
> Что пробовалось: положить файл в папку статики по пути, аналогичным<br>
> location и с тем же именем, и поменять $document_root в блоке if'a, но: из<br>
> if'a тоже надо как-то выходить - break не годится (обработка пойдет дальше<br>
> по локейшену и в результате - запрос будет проксирован), return не годится<br>
> (клиент не понимает редиректов), rewrite... а смысл? все равно в итоге<br>
> return new location.<br>
<br>
Вам нужно по условию сделать внутреннее перенаправление, как-то<br>
так:<br>
<br>
    location = /some/app/url/messenger.asmx {<br>
        if (...) {<br>
            rewrite ^ /some/app/url/static/messengerwsdl.xml last;<br>
        }<br>
<br>
        proxy_pass ...<br>
    }<br>
<br>
    location = /some/app/url/static/messengerwsdl.xml {<br>
        # static file<br>
    }<br>
<br>
В результате клиенту на исходный запрос будет возвращён<br>
статический файл, обычно доступный по заданному адресу.<br>
<br>
Подробнее тут:<br>
<br>
<a href="http://nginx.org/r/rewrite" target="_blank">http://nginx.org/r/rewrite</a><br>
<br>
[...]<br>
<br>
> #$ nginx -V<br>
> nginx version: nginx/1.0.15<br>
<br>
Антиквариат, однако.<br>
<br>
--<br>
Maxim Dounin<br>
<a href="http://nginx.org/" target="_blank">http://nginx.org/</a><br>
<br>
<br>
<br>_______________________________________________<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" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a><br></blockquote></div><br></div></div>