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