Re: эмуляция if/else

David Mzareulyan david at hiero.ru
Thu Apr 24 13:02:31 MSD 2008


Так никто на вопрос-то и не ответил -- про last/break. А место в самом деле 
не очень понятное. Вот на http://sysoev.ru/nginx/docs/http/ngx_http_rewrite_module.html#rewrite 
написано:

===============
Если же эти директивы поместить в location /download/, то нужно заменить 
флаг last на break, иначе nginx сделает 10 циклов и вернёт ошибку 500:

        location /download/ {
            rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  break;
            rewrite  ^(/download/.*)/audio/(.*)\..*$  $1/mp3/$2.ra   break;
            return   403;
        }
===============

Во-первых, ПОЧЕМУ last вызовет зацикливание? После первого же рерайта запрос 
перестанет попадать в паттерн -- там же media заменится на mp3. Во-вторых, 
куда всё-таки пойдёт управление после break? На return? Или поскольку return 
тоже "директива ngx_http_rewrite_module" -- дальше пойдёт отдача из этой 
локации статикой?

> Всегда были не совсем ясны сходство и различия break;, rewrite break и
> rewrite last.
> 
> Обычная задача. Существующие файлы отдавать статикой, несуществующие
> проксировать. Сейчас написано два if: -f и !-f.
> 
> Как это написать более правильно?
> 
> Может так? Есть комментарии по поводу этого куска?
> 
> location / {
> if (-f $request_filename) {
> break;
> root html;
> }
> proxy_pass http://127.0.0.1:1234;
> }
> Вдогонку.
> 
> proxy_pass http://localhost/; # (!!!) / в конце
> 
> это то же самое, что
> 
> rewrite .* /;
> proxy_pass http://localhost;
> ?
> 
> Заранее спасибо за помощь.
> 


-- 
С уважением
Давид Мзареулян
david at hiero.ru








More information about the nginx-ru mailing list