Т.е. $1 заменяется на значение не в тот момент, когда он встречается в переменной, а в самый последний, когда переменная вставляется в ту или иную директиву?
Я ожидал, что в конструкции
set $docroot /your/app/$1/htdocs;
в $docroot попадет уже ОКОНЧАТЕЛЬНАЯ строка, в которой нет упоминаний $1 и т.д... Аналогично, что в
root /your/app/$1/htdocs
директиве root будет скормлена уже интерполированная строка, без информации о $1.
On Fri, Nov 06, 2009 at 01:08:21PM +0300, Dmitry Koterov wrote:
> Похоже на баг.
> nginx/0.7.62
>
> Я обнаружил, что связка вот таких директив не работает (fastcgi_php не
> срабатывает):
>
> server_name ~^([a-z0-9]+)\.example\.com$
> root /your/app/$1/htdocs
> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
>
> А вот такие, по смыслу, казалось бы, идентичные, - работают:
>
> server_name ~^([a-z0-9]+)\.example\.com$
> set $docroot /your/app/$1/htdocs;
> root $docroot;
> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
>
> Видимо, если в root содержатся regexp-маркеры (типа $1), они неправильно
> обрабатываются в $document_root, в итоге fastcgi_param не срабатывает.
$1 - это capture от последнего выполнившегося регекспа. Если по
дороге от матчинга server_name до fastcgi_pass случится хотя бы
один regexp (e.g. regexp location, причём не обязательно
совпавший) - первая конфигруация ожидаемо сломается.
А вторая конфигурация сломается если случится регексп и внутренний
редирект с повторным поиском совпавшего location'а (e.g. regexp
location + rewrite ... last).