2012-06-19 9 views
5

Ho codificato un modulo filtro NGINX in grado di leggere/scrivere i cookie per le richieste in arrivo. Se un determinato cookie non è impostato correttamente (ad esempio cookie di autenticazione), imposterà lo stato dell'intestazione in uscita sul codice di errore appropriato. Funziona bene secondo le indicazioni di Evan Miller's tutorial. La parte successiva che sto cercando di funzionare (e non ho finora) sta facendo invocare il filtro del corpo in modo da poter inserire/sostituire il testo di risposta del corpo quando si verificano risposte di errore. Ho nuovamente seguito Evan Miller's tutorial sui filtri del corpo e non riesco a farlo funzionare. Ecco la mia messa a punto:Moduli di intestazione e corpo 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; 
} 

Questa è la mia impostazione di base, e, per quanto posso dire, è posto su tutti gli esempi/tutorial che ho incontrato. Mi chiedo se c'è qualcosa di completamente diverso che devo abilitare ... come un'opzione di configurazione NGINX, NGINX ./configure opzione di compilazione, ecc.

Qualsiasi aiuto è molto apprezzato.

+0

Qual è la versione NGINX che si sta utilizzando? Quali parametri ./configure hai usato? Ho avuto un problema simile cercando di eseguire un modulo filtro del corpo con la versione stabile, quindi ho provato con la versione dev (1.3.5) e ha funzionato (non so perché). – Alex

risposta

0

Ho notato che Evan non risolve la lunghezza del contenuto http in ngx_http_<module_name>_header_filter().

Se non aggiungo la lunghezza del contenuto http (r->headers_out.content_length_n), il testo inserito alla fine della richiesta non verrà emesso da nginx-1.2.7 stabile.

Inoltre è possibile vedere footer filter module.

Problemi correlati