Heim  >  Artikel  >  Backend-Entwicklung  >  文章19:Nginx中为http请求或响应添加头部字段

文章19:Nginx中为http请求或响应添加头部字段

WBOY
WBOYOriginal
2016-08-08 09:19:122209Durchsuche

欢迎转载 转载请注明出处http://blog.csdn.net/yankai0219/article/details/8270219

0.序1.upload模块中添加头部字段

2.Nginx对于ngx_http_headers_out_t  headers_out.headers成员变量的处理

            1)请求:

            2)响应:

3.向请求或者响应中添加头部字段

            1)程序 在请求中添加头部字段 helloHeaders 内容123344

0.序

     根据项目需要,需要向http响应中添加文件的md5头部字段。众所周知,Nginx的响应的头部字段都在ngx_http_headers_out_t 结构体中,通过查阅我们发现里面并没有md5头部字段。那是不是http协议不支持md5头部字段呢?

     通过查阅文章,我们可以发现http协议支持md5头部字段,但是nginx在ngx_http_headers_out_t 结构体中没有添加该头部字段。nginx作者对此的解释http://mailman.nginx.org/pipermail/nginx/2008-July/006251.html

     那么Nginx是不是真的不支持md5头部字段呢?通过查阅发现upload模块支持content-md5头部字段。那么说明nginx是支持content-md5,那么我们如何实现呢?

     综上所述:1)http协议支持md5头部字段 2)Nginx支持content-md5

1.upload模块中添加头部字段

在nginx upload模块中通过ngx_http_upload_add_header解析配置文件中的头部字段保存到ulcf->header_templates中,然后通过调用ngx_http_upload_add_headers函数,将头部字段添加到响应的头部中。接下来我们分析是如何添加到响应头部中的。

在Nginx upload模块源码中可以看到ngx_http_upload_add_headers函数。

     其过程为:1)解析ulcf->header_templates中的头部字段

                      2)ngx_http_headers_out_t  headers_out的ngx_list_t headers中添加一个元素 。

                      3)为该新添加的元素填充值。

     

static ngx_int_t ngx_http_upload_add_headers(ngx_http_request_t *r, ngx_http_upload_loc_conf_t *ulcf) { /* {{{ */

               ...............

                h = ngx_list_push(&r->headers_out.headers); //在ngx_http_headers_out_t  headers_out的ngx_list_t 

                

                /*接下来,就是为该新添加的元素填充值*/

                h->hash = 1;

                h->key.len = name.len;

                h->key.data = name.data;

                h->value.len = value.len;

                h->value.data = value.data;

                ...........................

} /* }}} */

2.Nginx对于ngx_http_headers_out_t  headers_out.headers成员变量的处理

1)请求:

在ngx_http_proxy_create_request函数中,我们可以看到一个http请求的构建(包括请求行、请求头、请求体三部分),我们只需要看一下对请求头的处理即可。

if (plcf->upstream.pass_request_headers) {
        part = &r->headers_in.headers.part;
        header = part->elts;
         for (i = 0; /* void */ ; i++) {
            if (i >= part->nelts) {
                if (part->next == NULL) {
                    break ;
                }
                part = part->next;
                header = part->elts;
                i = 0;
            }
            if (ngx_hash_find(&plcf->headers_set_hash, header[i].hash,
                              header[i].lowcase_key, header[i].key.len))
            {
                continue ;
            }
            b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len);
            *b->last++ = ':' ; *b->last++ = ' ' ;
            b->last = ngx_copy(b->last, header[i].value.data,
                               header[i].value.len);
            *b->last++ = CR; *b->last++ = LF;
           ...
        }
    }

2)响应:

对于headers的处理是在ngx_http_header_filter_module模块中的ngx_http_header_filter,其过程与请求中的header处理很类似。

3.向请求或者响应中添加头部字段

在ngx_http_request_t中成员变量headers_in及headers_out中都有ngx_list_t headers成员变量。其作用用于存储头部字段。在这个函数里面可以看到ngx_list_push(&r->headers_out.headers)函数,将头部字段放入响应中。

举一反三,可以采用ngx_list_push(&r->headers_in.headers)函数,将头部字段放入请求中。

1)程序 在请求中添加头部字段 helloHeaders 内容123344

该函数位于ngx_http_proxy_module.c的ngx_http_proxy_handler中

void  yk_add_headers_in( ngx_http_request_t *r) { /* {{{ */
                 printf("begin into yk_add_headers_in" );
                 ngx_table_elt_t                      *h;
                 ngx_str_t name = ngx_string("helloHeaders" );
                 ngx_str_t value = ngx_string("123344" );
                 h = ngx_list_push(&r-> headers_in.headers );
                 if(h == NULL){
                                 return ;
                 }
                 h-> hash = 1;
                 h-> key.len = name.len;
                 h-> key.data = name.data;
                 h-> value.len = value.len;
                 h-> value.data = value.data;
}
#endif

由于我是设置代理,因此所有的请求都会进入ngx_http_proxy_handler函数,因此在ngx_http_proxy_handler函数刚开始处,加入  yk_add_headers_in( r),那么所有的请求头部中都会有helloHeaders头部字段。通过抓包可以看到的确如此。

               

以上就介绍了文章19:Nginx中为http请求或响应添加头部字段,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn