Home  >  Article  >  Backend Development  >  Article 19: Adding header fields to http requests or responses in Nginx

Article 19: Adding header fields to http requests or responses in Nginx

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

Welcome to reprint and reprint, please indicate the source http://blog.csdn.net/yankai0219/article/details/8270219

0. Preface 1. Add the header field in the upload module

2. Nginx for ngx_http_headers_out_t Processing of headers_out.headers member variables

1) Request: 2) Response:

3. Add head field to request or response

1) Program adds head field helloheaders content 123344

123344🎜🎜🎜🎜🎜🎜

0. Preface

Based on the needs of the project, you need to add the md5 header field of the file to the http response. As we all know, the header fields of Nginx response are all in the ngx_http_headers_out_t structure. By looking up, we found that there is no md5 header field in it. Does that mean that the http protocol does not support the md5 header field?

By consulting the article, we can find that the http protocol supports the md5 header field, but nginx does not add this header in the ngx_http_headers_out_t structure field. nginx author's explanation http://mailman.nginx.org/pipermail/nginx/2008-July/006251.html

So does Nginx really not support the md5 header field? After checking, I found that the upload module supports the content-md5 header field. So it means that nginx supports content-md5, so how do we implement it?

In summary: 1) http protocol supports md5 header field 2) Nginx supports content-md5

1. Add header field in upload module

Parse configuration file through ngx_http_upload_add_header in nginx upload module Save the header fields in ulcf->header_templates, and then add the header fields to the header of the response by calling the ngx_http_upload_add_headers function. Next we analyze how it is added to the response header.

You can see the ngx_http_upload_add_headers function in the Nginx upload module source code.

The process is: 1) Parse the header fields in ulcf->header_templates

2) In ngx_http_headers_out_t Add an element to ngx_list_t headers of headers_out.

                        3) Fill in the value for the newly added element. : r

,

ngx_http_upload_loc_conf_t*

ulcf) { / * {{{ */                                                     -> headers_out.headers); //In ngx_http_headers_out_t ngx_list_t of headers_out

                                                                                                                              t;

hash=1; h->key.len=name.len;

->

key

.data = name.data;

                h->value.len = value.len;

                h->value.data = value.data;

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

} /* }}} */

2.Nginx for ngx_http_headers_out_t Processing of headers_out.headers member variables

1) Request:

In the ngx_http_proxy_create_request function, we can see the construction of an http request (including three parts: request line, request header, and request body). We only need Just take a look at the processing of request headers.

if(plcf->upstream.pass_request_headers) {
part = &r->headers_in.headers. part;
     header = part->elts;
                                                            = 0;​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ >= part->nelts) {                                        == NULL) { Break
; } part = part-& gt; next;
header = part->elts; i = 0;
}if
(ngx_hash_find(&plcf->headers_set_hash, header[i].hash,
                                                                                                                                                                                                                                                  header[i].
                                                         ;
                                                                                                                                   );
         *b->last++ =
' '; b->last = ngx_copy(b->last, header[i].value.data,
                                                                                                                                             header[i].value.len);
                                                                                                                                                                                                                       }

2) Response:

The processing of headers is ngx_http_header_filter in the ngx_http_header_filter_module module. The process is very similar to the header processing in the request.

3. Add header fields to the request or response

There are ngx_list_t headers member variables in the ngx_http_request_t member variables headers_in and headers_out. Its role is to store header fields. In this function, you can see the ngx_list_push(&r->headers_out.headers) function, which puts the header fields into the response.

By analogy, you can use the ngx_list_push(&r->headers_in.headers) function to put the header fields into the request.

1) Program Add header field helloHeaders content 123344 in the request

This function is located in ngx_http_proxy_handler of ngx_http_proxy_module.c

                                                              The above introduces article 19: Adding header fields to http requests or responses in Nginx, including the content. I hope it will be helpful to friends who are interested in PHP tutorials.
void yk_add_headers_in( ngx_http_request_t*r) { /* {{{ */
                                      into yk_add_headers_in");                                *h;                                                        = ngx_string(
"helloHeaders" ); value = ngx_string(
"123344"); h = ngx_list_push(&r-> headers_in.
headers) ;                                                              ==NULL){
                                                                                                                                       = 1;                                h-> name.len;
data= name.data
; h->value
. len
= value.len;h-> value.
data;}#endifThanks to me It is to set the proxy, so all requests will enter the ngx_http_proxy_handler function, Therefore, at the beginning of the ngx_http_proxy_handler function, add
yk_add_headers_in(
r), then all request headers will have the helloHeaders header field. You can see that this is indeed the case through packet capture.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn