2012-06-19 2 views
5

Я кодировал модуль фильтра NGINX, который может читать/записывать файлы cookie для входящих запросов. Если конкретный cookie установлен неправильно (т. Е. Файл cookie для проверки подлинности), он установит статус исходящего заголовка на соответствующий код ошибки. Это отлично работает в направлениях Evan Miller's tutorial. Следующая часть, к которой я пытаюсь работать (и до сих пор не имею), вызывает вызов фильтра тела, поэтому я могу вставлять/заменять текст ответа тела, когда встречаются ответы об ошибках. Я снова следовал Evan Miller's tutorial на фильтрах тела, и я не могу на всю жизнь получить эту работу. Вот мои настройки:Модули фильтра заголовка и корпуса NGINX

static ngx_http_output_header_filter_pt ngx_http_next_header_filter; 
static ngx_http_output_body_filter_pt ngx_http_next_body_filter; 
... 
... 


static ngx_http_module_t ngx_http_source_cookie_module_ctx = { 
    NULL,        /* preconfiguration */ 
    ngx_http_source_cookie_init,    /* postconfiguration */ 

    NULL,        /* create main configuration */ 
    NULL,        /* init main configuration */ 

    NULL,        /* create server configuration */ 
    NULL,        /* merge server configuration */ 

    ngx_http_source_cookie_create_loc_conf, /* create location configuration */ 
    ngx_http_source_cookie_merge_loc_conf /* merge location configuration */ 
}; 

ngx_module_t ngx_http_source_cookie_module = { 
    NGX_MODULE_V1, 
    &ngx_http_source_cookie_module_ctx,  /* module context */ 
    ngx_http_source_cookie_commands,   /* module directives */ 
    NGX_HTTP_MODULE,     /* module type */ 
    NULL,        /* init master */ 
    NULL,        /* init module */ 
    NULL,        /* init process */ 
    NULL,        /* init thread */ 
    NULL,        /* exit thread */ 
    NULL,        /* exit process */ 
    NULL,        /* exit master */ 
    NGX_MODULE_V1_PADDING 
}; 
/*--------------------------------------------------------------------------*/ 

/*--------------------------------------------------------------------------*/ 
static ngx_int_t 
ngx_http_source_cookie_header_filter(ngx_http_request_t *r) 
{ 
    // this gets invoked 
    ... 
} 

/*--------------------------------------------------------------------------*/ 

/*--------------------------------------------------------------------------*/ 
static ngx_int_t 
ngx_http_body_filter(ngx_http_request_t *r, ngx_chain_t *in) 
{ 
    // this never get invoked 
    ... 
} 

/*--------------------------------------------------------------------------*/ 

/*--------------------------------------------------------------------------*/ 
static ngx_int_t 
ngx_http_source_cookie_init(ngx_conf_t *cf) 
{ 
    // registering of my filters 

    ngx_http_next_header_filter = ngx_http_top_header_filter; 
    ngx_http_top_header_filter = ngx_http_source_cookie_header_filter; 

    ngx_http_next_body_filter = ngx_http_top_body_filter; 
    ngx_http_top_body_filter = ngx_http_body_filter; 

    return NGX_OK; 
} 

Это моя основная установка, и, насколько я могу сказать, что это пятно на все примеры/учебники с которыми я столкнулся. Мне интересно, есть ли что-то совсем другое, мне нужно включить ... как вариант конфигурации NGINX, опцию компиляции NGINX ./configure и т. Д.

Любая помощь с благодарностью.

+0

Что такое версия NGINX, которую вы используете? Какие параметры ./configure вы использовали? У меня была аналогичная проблема с попыткой запустить модуль фильтрации тела со стабильной версией, затем я попытался с помощью dev-версии (1.3.5), и он работал (не знаю почему). – Alex

ответ

0

Отметьте, что Evan не фиксирует длину http-содержимого в ngx_http_<module_name>_header_filter().

Если я не добавляю длину содержимого http (r->headers_out.content_length_n), вставленный текст в конец запроса не будет выводиться из nginx-1.2.7 stable.

Также вы можете увидеть footer filter module.