一、请求头
conf->headers->hash
将proxy_set_header指令设置的头字段,以及ngx_http_proxy_headers结构体指定的字段,形成哈希表,用于头字段查找。如果两者内容冲突,以proxy_set_header为准。自定义部分,必须发送。
conf->headers->lengths:形成nginx脚本,计算上述头字段长度。
conf->headers->values:形成nginx脚本,计算上述头字段内容。
-
cmcf->headers_in_hash
根据ngx_http_headers_in结构体(该结构体定义一些请求头字段,并定义这些字段的赋值方法),对该哈希表进行初始化。用于请求头解析阶段对r->headers_in成员进行初始化。 -
解析(ngx_http_parse_header_line)
-
处理(ngx_http_process_request_headers)
对r->headers_in进行赋值。对于headers_in_hash能查到的,保存在r->headers_in.headers的同时还需要保存在r->headers_in具体字段;对于查不到的,直接保存在r->headers_in.headers。对于invalid_header,例如“_”开始的头字段、非字母数字开始的头字段,根据配置(ignore_invalid_headers)选择是否保存。 -
发送(u->create_request(ngx_http_proxy_create_request))
/*首先使用plcf->headers->values脚本,对nginx自定义字段进行发送*/ e.ip = headers->values->elts; e.pos = b->last; e.request = r; e.flushed = 1; le.ip = headers->lengths->elts; while (*(uintptr_t *) le.ip) { } /*根据pass_request_headers配置(默认使能),将r->headers_in.headers中保存的原始报文的头字段进行发送,在发送前,首先用变量名查询conf->headers->hash哈希表,如果原始字段和自定义字段冲突,已自定义字段为准*/ if (plcf->upstream.pass_request_headers) { }
二、响应头
-
读取(ngx_http_proxy_process_header)
umcf->headers_in_hash哈希表:ngx_http_upstream_init_main_conf函数会根据ngx_http_upstream_headers_in结构体(该结构体定义一些响应头字段,并定义这些字段的赋值方法),对该哈希表进行初始化。当解析结束后,nginx使用解析到的头字段name查询上述哈希表,并通过相对应的handler方法,对r->upstream->headers_in.xxx赋值。hh = ngx_hash_find(&umcf->headers_in_hash, h->hash, h->lowcase_key, h->key.len); if (hh && hh->handler(r, h, hh->offset) != NGX_OK) { return NGX_ERROR; }
给r->upstream->headers_in.headers增加“server”和“date”字段。
-
解析(ngx_http_parse_header_line)
-
存储(r->upstream->headers_in.headers(ngx_http_upstream_headers_in_t))
-
处理(ngx_http_upstream_process_headers)
把已经解析出的头部设置到请求结构体ngx_http_request_t的headers_out成员中。
u->conf->hide_headers_hash:将proxy_hide_header指令设置的头字段,以及ngx_http_proxy_hide_headers结构体指定的字段,形成哈希表,用于设置禁止向客户端传输的响应头字段。但proxy_pass_header指定中设置的头字段将置为例外,从禁止从排除。
如果字段存在于umcf->headers_in_hash中,则调用hh->copy_handler方法,将内容拷贝到r->headers_out。如果字段不存在与,则直接拷贝到r->headers_out.headers。 -
发送(ngx_http_header_filter)