2012-06-19 23 views
5

Gelen istekler için çerezleri okuyabilen/yazabilen bir NGINX filtre modülü kodluyorum. Belirli bir çerez doğru ayarlanmamışsa (yani kimlik doğrulama bilgisi), giden başlık durumunu uygun hata koduna göre ayarlar. Bu, Evan Miller's tutorial yönergelerine göre iyi çalışır. Çalışmaya çalıştığım sonraki kısım (ve şimdiye kadar uzak değil), gövde filtresinin çalıştırılmasını sağlayarak, hata yanıtları ile karşılaşıldığında vücut yanıt metni ekleyebilir/değiştirebilirim. Vücut filtrelerinde Evan Miller's tutorial'u tekrar izledim ve bu çalışmayı benim için yaşayamam. İşte benim Kurulum:NGINX Başlık ve Gövde Filtre Modülleri

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; 
} 

Bu benim temel kurulum ve bildiğim kadarıyla söyleyebilirim, ben rastlamak onca örnekler/öğreticiler üzerinde nokta var. NGINX konfigürasyon seçeneği, NGINX ./configure derleme seçeneği, vb. Gibi, tamamen farklı bir şey var mı diye merak ediyorum.

Herhangi bir yardım büyük ölçüde takdir edilmektedir.

+0

Kullandığınız NGINX sürümü nedir? Hangi ./configure parametrelerini kullandınız? Ben kararlı sürümü ile bir vücut filtresi modülü çalıştırmak için çalışırken benzer bir sorun vardı, sonra dev sürümü (1.3.5) ile çalıştı ve çalıştı (neden bilmiyorum). – Alex

cevap

0

Evan'un http içerik uzunluğunu ngx_http_<module_name>_header_filter() içinde düzeltmediğini unutmayın.

http içerik uzunluğunu (r->headers_out.content_length_n) eklemezseniz, eklenen metnin isteği sonuna kadar nginx-1.2.7 sabit olarak alınmaz.

Ayrıca footer filter module'u da görebilirsiniz.