ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



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



 




Copyright © Lexa Software, 1996-2009.