Nginx, regex-домены, "root /your/app/$1/htdocs"

Maxim Dounin mdounin at mdounin.ru
Sat Nov 7 03:24:25 MSK 2009


Hello!

On Sat, Nov 07, 2009 at 01:05:31AM +0300, Dmitry Koterov wrote:

> > Все переменные (и $1 не исключение) подставляются в тот момент,
> > когда строка содержащая переменные реально используется.
> >
> ИМХО для $1, $2 и т.д. такое поведение как раз не очень логично... но,
> наверное, по-другому сделать архитектурно сложнее.

Вообще использование $1 в разных директивах декларативного конфига 
- это выстрел в ногу.

> > > Я ожидал, что в конструкции
> > >
> > > set $docroot /your/app/$1/htdocs;
> > >
> > > в $docroot попадет уже ОКОНЧАТЕЛЬНАЯ строка, в которой нет упоминаний $1
> > и
> > > т.д... Аналогично, что в
> >
> > Да, попадёт.  Когда отработает соответствующий set.  Это случится
> > где-то в районе фазы серверных rewrite'ов (если set на уровне
> > server{}).
> >
> > Шутка состоит в том, что эта самая фаза - выполняется повторно при
> > очередном поиске совпадения между uri и location (после rewrite ...

Я ошибся, после rewrite ... last серверные рерайты снова не 
отрабатывают.  Только после внутренних редиректов (e.g. по 
X-Accel-Redirect, index, error_page, ...).

> > last).  И там снова отрабатывает set.  И заново ставит $docroot,
> > но на этот раз в $1 уже может быть совсем не то что ожидалось.
> >
> Спасибо, примерно понятно.
> Можно ли (для истории) попросить Вас привести пример конфига, иллюстрирующий
> этот эффект?

Конфиг:

    server {
        server_name ~^www\.(.*)\.example\.com$;
        listen 8081;

        set $name $1;
        root /tmp/$name;

        location / {
            rewrite ^blah blah break;
            index index.html;
        }
    }

Есть файл:

/tmp/xxx/index.html

Запрашиваем www.xxx.example.com/index.html - получаем файл, 
запрашиваем www.xxx.example.com/ - получаем внутренний редирект на 
/index.html и тыкву (404) на выходе, потому что не имеющий 
отношения к делу rewrite поменял captures.

Возможные решения проблемы тут уже не раз обсуждались, наиболее 
привлекательным выглядит использование именованных captures.

Maxim Dounin





More information about the nginx-ru mailing list