Спасибо за подробны<br><br><div class="gmail_quote">2009/11/7 Maxim Dounin <span dir="ltr">&lt;<a href="mailto:mdounin@mdounin.ru">mdounin@mdounin.ru</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hello!<br>
<div class="im"><br>
On Sat, Nov 07, 2009 at 01:05:31AM +0300, Dmitry Koterov wrote:<br>
<br>
&gt; &gt; Все переменные (и $1 не исключение) подставляются в тот момент,<br>
&gt; &gt; когда строка содержащая переменные реально используется.<br>
&gt; &gt;<br>
&gt; ИМХО для $1, $2 и т.д. такое поведение как раз не очень логично... но,<br>
&gt; наверное, по-другому сделать архитектурно сложнее.<br>
<br>
</div>Вообще использование $1 в разных директивах декларативного конфига<br>
- это выстрел в ногу.<br>
<div class="im"><br>
&gt; &gt; &gt; Я ожидал, что в конструкции<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; set $docroot /your/app/$1/htdocs;<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; в $docroot попадет уже ОКОНЧАТЕЛЬНАЯ строка, в которой нет упоминаний $1<br>
&gt; &gt; и<br>
&gt; &gt; &gt; т.д... Аналогично, что в<br>
&gt; &gt;<br>
&gt; &gt; Да, попадёт.  Когда отработает соответствующий set.  Это случится<br>
&gt; &gt; где-то в районе фазы серверных rewrite&#39;ов (если set на уровне<br>
&gt; &gt; server{}).<br>
&gt; &gt;<br>
&gt; &gt; Шутка состоит в том, что эта самая фаза - выполняется повторно при<br>
&gt; &gt; очередном поиске совпадения между uri и location (после rewrite ...<br>
<br>
</div>Я ошибся, после rewrite ... last серверные рерайты снова не<br>
отрабатывают.  Только после внутренних редиректов (e.g. по<br>
X-Accel-Redirect, index, error_page, ...).<br>
<div class="im"><br>
&gt; &gt; last).  И там снова отрабатывает set.  И заново ставит $docroot,<br>
&gt; &gt; но на этот раз в $1 уже может быть совсем не то что ожидалось.<br>
&gt; &gt;<br>
&gt; Спасибо, примерно понятно.<br>
&gt; Можно ли (для истории) попросить Вас привести пример конфига, иллюстрирующий<br>
&gt; этот эффект?<br>
<br>
</div>Конфиг:<br>
<br>
    server {<br>
        server_name ~^www\.(.*)\.example\.com$;<br>
        listen 8081;<br>
<br>
        set $name $1;<br>
        root /tmp/$name;<br>
<br>
        location / {<br>
            rewrite ^blah blah break;<br>
            index index.html;<br>
        }<br>
    }<br>
<br>
Есть файл:<br>
<br>
/tmp/xxx/index.html<br>
<br>
Запрашиваем <a href="http://www.xxx.example.com/index.html" target="_blank">www.xxx.example.com/index.html</a> - получаем файл,<br>
запрашиваем <a href="http://www.xxx.example.com/" target="_blank">www.xxx.example.com/</a> - получаем внутренний редирект на<br>
/index.html и тыкву (404) на выходе, потому что не имеющий<br>
отношения к делу rewrite поменял captures.<br>
<br>
Возможные решения проблемы тут уже не раз обсуждались, наиболее<br>
привлекательным выглядит использование именованных captures.<br>
<font color="#888888"><br>
Maxim Dounin<br>
<br>
</font></blockquote></div><br>