How to unset header in nginx module

Maxim Dounin mdounin at mdounin.ru
Fri Mar 16 17:32:23 UTC 2012


Hello!

On Sat, Mar 17, 2012 at 01:58:14AM +0900, Tsukasa Hamano wrote:

> Hi,
> 
> I'd like to delete particular headers_in like a apr_table_unset() in
> request handler of my module.
> 
> I wrote examples from the article:
> http://wiki.nginx.org/HeadersManagement
> 
> static void unset_header(ngx_http_request_t *r, u_char *key){
>     ngx_list_part_t *part;
>     ngx_table_elt_t *h;
>     ngx_uint_t i;
>     size_t len = strlen((char *)key);
> 
>     part = &r->headers_in.headers.part;
>     h = part->elts;
>     for (i = 0; ; i++) {
>         if (i >= part->nelts) {
>             if (part->next == NULL) {
>                 break;
>             }
>             part = part->next;
>             h = part->elts;
>             i = 0;
>         }
>         if (len != h[i].key.len || ngx_strcasecmp(key, h[i].key.data) != 0) {
>             h[i].hash = 0;
>             h[i].key.len = 0;
>             h[i].key.data = NULL;
>             h[i].value.len = 0;
>             h[i].value.data = NULL;
>             h[i].lowcase_key = NULL;
>         }
>     }
> }
> 
> But this code send empty header(only colon) line to backend.
> like this:
> 
> :
> 
> Should I reconstruct list of headers_in.headers?
> Or, should I modify http main module that to avoid sending null header?
> Or, Is there any better(faster) way?

You shouldn't touch r->headers_in at all.  It represents headers 
got from client, and it's incorrect to change them.

Instead, to restrict headers passed to backends you should use 
functionality provided by relevant backend modules, e.g. with 
proxy_pass use

    proxy_set_header X-Some-Header "";

Maxim Dounin



More information about the nginx mailing list