Re: Если в пути "root" указана переменная, не находит index

Maxim Dounin mdounin на mdounin.ru
Сб Фев 12 03:39:26 MSK 2011


Hello!

On Fri, Feb 11, 2011 at 06:10:26PM -0500, nix wrote:

> Подскажите, а из-за чего nginx 0.8.54 при
> следующей конфигурации может
> вставлять пустую переменную $branch в root
> (root находится вне location) в то время, как в
> location со статикой $branch в root передается
> как "dev"? Пробую заходить по ссылке
> http://dev.test.dev.domain.ru/
> 
> server {
>     listen 80;
>     server_name ~^(.*)\.test\.dev\.domain\.ru$ test.dev.domain.ru;
>     set $branch $1;
> 
>     charset utf-8;
>     root /srv/www/test/repo/$branch/htdocs;
>     index index.php;
> 
>     location ~*
> \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|flv|avi|djvu|mp3|mp4|ogv)$
> {
>         root /srv/www/test/repo/$branch/htdocs;
>     }
> }

Вопрос: как работает директива index?

Ответ: модуль index проверяет существование файлов с заданными 
именами, и если находит, то делает внутренний редирект на нужный 
индексный файл.

Вопрос: как работает директива set?

Ответ: директива set выполняется в фазе rewrite (server rewrite 
для директив заданных на уровне server) и устанавливает 
заданную переменную в заданное значение.

Вопрос: что представляет собой переменная $1?

Ответ: переменная $1 содержит выделение из последнего выполненного 
регулярного выражения.

Вопрос: какое значение будет иметь переменная $branch в 
приведённом выше конфиге после внутреннего редиректа на индексный 
файл? 

Ответ: после внутреннего редиректа server rewrites будут выполнены 
повторно, и переменная $branch будет установлена в $1.  При этом 
последним регулярным выражением будет (неуспешное) тестирование "location ~* 
...", т.е. значение $1 будет неопределено.

Вопрос: как быть?

Ответ: никогда не использовать нумерованные выделения в 
server_name.  Если нужны выделения - использовать *именованные* 
выделения.

http://nginx.org/en/docs/http/server_names.html#regex_names

Maxim Dounin



Подробная информация о списке рассылки nginx-ru