[nginx][http] nginx关于http header的设置
nginx关于http header有以下三个配置。
1 proxy_set_header
https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header
配置命令proxy_set_header,是在ngx_http_proxy_module里边定义的。
用来对http request header进行修改。
2 add_header
https://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header
配置命令 add_header,是在ngx_http_headers_module里边定义的。
用来对http server返回的http response header进行修改,
修改的方法是,追加的在header的最前面。
3 add_tailer
http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_trailer
配置命令 add_tailer,是在ngx_http_headers_module里边定义的。
功能与add_header相同,区别是添加在header的结尾。
4 http header的顺序
既然有了添加到开头或者添加到结尾的区别。那么不禁要问,http header里边的KV结构是否存在顺序区别呢?
通过阅读rfc 2616,可以了解到如下内容:
rfc对http的header顺序没有强制要求,但是一个好的最佳实践一般是:
依次应该为:general-header, request-header or response-header, entity-header.
The order in which header fields with differing field names are received is not significant. However,
it is "good practice" to send general-header fields first, followed by request-header
or response- header fields, and ending with the entity-header fields.
另外, 如果有多个名字相同的header存在时,“实现”应该将他们的值压缩在一起,用逗号分隔。
逗号分隔后的内容是否包含了顺序信息应该有通讯两端定义,作为中间人的proxy不应该修改他们。
Multiple message-header fields with the same field-name MAY be present in a message if and only if
the entire field-value for that header field is defined as a comma-separated list [i.e., #(values)].
It MUST be possible to combine the multiple header fields into one "field-name: field-value" pair,
without changing the semantics of the message, by appending each subsequent field-value to the
first, each separated by a comma. The order in which header fields with the same field-name are
received is therefore significant to the interpretation of the combined field value,
and thus a proxy MUST NOT change the order of these field values when a message is forwarded.