Home >Backend Development >PHP Tutorial >Article 19: Adding header fields to http requests or responses in Nginx
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 |
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
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
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
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
3) Fill in the value for the newly added element. : r
,
ulcf) { / * {{{ */ -> headers_out.headers); //In ngx_http_headers_out_t ngx_list_t of headers_out t; hash=1; h->key.len=name -> key .data = name.data; h->value.len = value.len; h->value.data = value.data; ........................... } /* }}} */ |
2.Nginx for
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
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.
|