ПРОЕКТЫ 


  АРХИВ 


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: порядок прохождения http-фаз сервера



Hello!

On Mon, Mar 18, 2013 at 10:49:59PM +0400, Oleg wrote:

> On Mon, Mar 18, 2013 at 08:00:55PM +0400, Maxim Dounin wrote:
> > Hello!
> > 
> > >   А http-redirect может только модуль фазы NGX_HTTP_CONTENT_PHASE слать 
> > > или с
> > > фазы NGX_HTTP_ACCESS_PHASE тоже можно слать перенаправления?
> > 
> > Можно из любой фазы (но может требовать дополнительных 
> > приседаний).
> 
>   Так. Попробовал по-быстрому сделать перенаправление. Никаких приседаний не
> заметил, по крайней мере для фазы NGX_HTTP_ACCESS_PHASE. Может, чего-то не
> учёл, конечно, но сделал в лоб:
> 
>     h = r->headers_out.location;
>     if ( h == NULL ) {
>       h = ngx_list_push(&r->headers_out.headers);
>       if ( h == NULL )
>         return NGX_ERROR;
> 
>       h->key.data = "Location";
>       h->key.len = sizeof("Location") - 1;
> 
>       r->headers_out.location = h;
>     }
>     h->value.data = "http://ya.ru";;
>     h->value.len = sizeof("http://ya.ru";) - 1;
>     h->hash = 1;
> 
>     r->headers_out.status = NGX_HTTP_TEMPORARY_REDIRECT;
>     ngx_http_send_header(r);
> 
>     return NGX_OK;
> 
>   Работает нормально.

Так, насколько я понимаю, будет мусор на выходе - сначала ответ 
302 без тела, а потом ответ на исходный запрос.  Посмотрите 
telnet'ом на ответ.

Для access-фазы проще всего добавить заголовок location, и вернуть 
NGX_HTTP_TEMPORARY_REDIRECT (BTW, хочется возвращать именно 307?).  
Собственно, так же, как и для content-фазы, ибо там есть 
специальная обработка NGX_HTTP_*.  Как-то так (выдержка из 
ngx_http_static_module.c):

    ngx_http_clear_location(r);

    r->headers_out.location = ngx_palloc(r->pool, sizeof(ngx_table_elt_t));
    if (r->headers_out.location == NULL) {
        return NGX_ERROR;
    }

    r->headers_out.location->value.len = len;
    r->headers_out.location->value.data = location;

    return NGX_HTTP_TEMPORARY_REDIRECT;

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

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.