Re: порядок прохождения http-фаз сервера

Maxim Dounin mdounin at mdounin.ru
Mon Mar 18 16:00:55 UTC 2013


Hello!

On Mon, Mar 18, 2013 at 07:38:07PM +0400, Oleg wrote:

> On Mon, Mar 18, 2013 at 06:53:22PM +0400, Maxim Dounin wrote:
> > Hello!
> > 
> > >   Например, надо сделать в случае неудачной аутентификации редирект на страницу
> > > с логином/паролем:
> > > 
> > >   location = /login {
> > >     # тут страница для аутентификации и редиректом на /user/$USERNAME в случае
> > >     # удачи.
> > >     fastcgi_pass 127.0.0.1:9000;
> > >     include fastcgi_params;
> > >     fastcgi_param SERVER_NAME $http_host;
> > >   }
> > >   location /user/user1 {
> > >     # аутентификация по cookie, полученном в локации /login
> > >     auth_cookie "CGISESSID";
> > >     auth_cookie_path "/tmp";
> > > 
> > >     # cookie кончился
> > >     if ( $auth_cookie_fail ) {
> > >       return 302 http://$host/login;
> > >     }
> > > 
> > >     proxy_pass http://127.0.0.2:2001/;
> > >     include proxy_params;
> > >   }
> > > 
> > >   $auth_cookie_fail устанавливается модулем auth_cookie. Я так понимаю, так
> > > не получится?
> > 
> > Совершенно верно.
> 
>   А http-redirect может только модуль фазы NGX_HTTP_CONTENT_PHASE слать или с
> фазы NGX_HTTP_ACCESS_PHASE тоже можно слать перенаправления?

Можно из любой фазы (но может требовать дополнительных 
приседаний).

>   И ещё вопрос. Здесь - http://www.evanmiller.org/nginx-modules-guide.html -
> написано, что хэндлер контента может быть только один и вешается так:
> 
>   clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
>   clcf->handler = ngx_http_circle_gif_handler;

Так вешаются content-обработчики, вызываемые для данного 
location'а.  Такие обработчики делать - проще всего, и в 
большинстве случаев именно они и нужны.  Опять же, такие 
обработчики - никак не влияют на обработку запросов в других 
location'ах.  Именно так работает proxy_pass (+ memcached, 
fastcgi, uwsgi, scgi), empty_gif, stub_status, perl и т.п.

Но это не всё, что бывает в content-фазе.  Если clcf->handler не 
стоит, или отказался от обработки запроса, то последовательно 
вызываются модули content-фазы, такие как random_index, index, 
autoindex, static.

>   Про хэндлеры фаз обработки запроса там, кстати, я ничего не нашёл.
>   Вопрос в чём. Можно ли повесить несколько handler'ов содержимого через
> фазу обработки запроса NGX_HTTP_CONTENT_PHASE? И можно ли это сделать так,
> что бы он вызывался гарантировано до proxy_pass?
>   Тогда, я могу там делать http-redirect на основе переменных, допустим.

Нет, так работать не будет.  Если стоит clcf->handler - то на 
обротчики content-фазы смотреть никто не будет.  Если вам нужно 
своим модулем проверить результат работы модуля access-фазы, то 
это надо делать в access-фазе же (и при этом убедившись, что 
satisfy стоит в all).

Загляните в ngx_http_core_module.c, там всё более или менее 
понятно.

-- 
Maxim Dounin
http://nginx.org/en/donation.html



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