How to unset header in nginx module


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:

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) {
        part = part->next;
        h = part->elts;
        i = 0;
    if (len != h[i].key.len || ngx_strcasecmp(key, h[i] != 
  1. {
    h[i].hash = 0;
    h[i].key.len = 0;
    h[i] = NULL;
    h[i].value.len = 0;
    h[i] = 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?

Thank you.


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

ngx_table_elt_t *h;
        part = part->next;

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 D.

Hi Maxim,

Thank you for your advice.

At Fri, 16 Mar 2012 21:32:23 +0400,
Maxim D. wrote:

proxy_pass use

proxy_set_header X-Some-Header "";

I want to modify and unset header based on client request. Apache can
do it. Is there a plan to make something like apr_table_unset()?

I found the following code:


I think I have no choise other than this code. but It looks
inefficient and slow.
Perhaps we can give meaning to key.len = 0 is unset flag, because
empty header name is not permitted by RFC.

Thanks for your comment.